EPICS modbus模块驱动程序示例2(模拟量)
模块 示例 驱动程序 MODBUS epics
2023-09-27 14:26:51 时间
本文以聚英电子的JY-DAMAIAO模拟量测控模块为例,讲解如何使用EPICS modbus模块实现对模拟设备读写控制。由于对设备施加电压以及测量电压都较电流容易,本人选择的这个模块能够读取6路0-10V的输入电压以及产生6路0-10V的输出电压。
程序安装过程与EPICS modbus模块驱动程序示例1(数字量)_yuyuyuliang00的博客-CSDN博客中讲解的类似,不同之处为这里使用的模板文件和启动文件不同。
1)编写模板文件:
在damaiao/damaiaoApp/Db路径下添加四个模板文件longinInt32.template,longoutInt32.template,aoWrite.template和aiRead.template并且修改Makefile文件。
a) longinInt32.template:这个记录能够读取寄存器的输入和保持寄存器的输入
record(longin,"$(P)$(R)") {
field(DTYP,"asynInt32")
field(INP,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")
field(SCAN, "$(SCAN)")
field(FLNK,"$(P)$(R):Value_RBV")
}
b ) longoutInt32.template:这个记录能够设置保持寄存器的值。
record(longout,"$(P)$(R)") {
field(SCAN, "Passive")
field(DTYP,"asynInt32")
field(OUT,"@asyn($(PORT) $(OFFSET))$(DATA_TYPE)")
field(INP, "$(P)$(R):SetVoltage")
}
c) aoWrite.template:这个记录把电压值转换成写入保持寄存器的整数。
record(ao, $(P)$(R):SetVoltage)
{
field(SCAN, "Passive")
field(DTYP, "Raw Soft Channel")
field(OMSL, "supervisory")
field(DRVH, "10")
field(DRVL, "0")
field(LINR, "NO CONVERSION")
field(AOFF, "0")
field(ASLO, "0.001")
field(ROFF, "0")
field(OUT, "$(P)$(R).VAL CA PP")
}
d) aiRead.template:这个记录把从寄存器输入或保持寄存器读取的输入值转成电压值。
record(ai, "$(P)$(R):Value_RBV")
{
field(DTYP, "Raw Soft Channel")
field(SCAN, "Passive")
field(INP, "$(P)$(R).VAL")
field(ROFF, "0")
field(ASLO, "0.001")
field(AOFF, "0")
field(LINR, "NO CONVERSION")
field(LOPR, "0")
field(HOPR, "10")
}
e) 修改Makefile文件
TOP=../..
include $(TOP)/configure/CONFIG
#----------------------------------------
# ADD MACRO DEFINITIONS AFTER THIS LINE
#----------------------------------------------------
# Create and install (or just install) into <top>/db
# databases, templates, substitutions like this
# Add your new created template files here
DB += longinInt32.template
DB += longoutInt32.template
DB += aiRead.template
DB += aoWrite.template
#----------------------------------------------------
# If <anyname>.db template is not named <anyname>*.template add
# <anyname>_template = <templatename>
include $(TOP)/configure/RULES
#----------------------------------------
# ADD RULES AFTER THIS LINE
2) 切换到这个IOC程序的顶层目录,即: damaiao下,执行make编译这个程序。
3) 切换到启动目录下,即:damaiao/iocBoot/iocdamaiao,创建一个数据库文件以及编辑启动文件st.cmd:
a) 创建一个数据库文件damaiao.substitutions,内容如下:
file "../../db/longinInt32.template" { pattern
{P, R, PORT, OFFSET, DATA_TYP E, SCAN}
{DAMAIAO: LHI1V A0_In_Word, 0, UINT16," I/O Intr"}
{DAMAIAO: LHI2V A0_In_Word, 1, UINT16," I/O Intr"}
{DAMAIAO: LHI3V A0_In_Word, 2, UINT16," I/O Intr"}
{DAMAIAO: LHI4V A0_In_Word, 3, UINT16," I/O Intr"}
{DAMAIAO: LHI5V A0_In_Word, 4, UINT16," I/O Intr"}
{DAMAIAO: LHI6V A0_In_Word, 5, UINT16," I/O Intr"}
}
file "../../db/aiRead.template" { pattern
{P, R}
{DAMAIAO: LHI1V}
{DAMAIAO: LHI2V}
{DAMAIAO: LHI3V}
{DAMAIAO: LHI4V}
{DAMAIAO: LHI5V}
{DAMAIAO: LHI6V}
}
file "../../db/longinInt32.template" { pattern
{P, R, PORT, OFFSET, DATA_TYP E, SCAN}
{DAMAIAO: LII1V A1_In_Word, 0, UINT16," I/O Intr"}
{DAMAIAO: LII2V A1_In_Word, 1, UINT16," I/O Intr"}
{DAMAIAO: LII3V A1_In_Word, 2, UINT16," I/O Intr"}
{DAMAIAO: LII4V A1_In_Word, 3, UINT16," I/O Intr"}
{DAMAIAO: LII5V A1_In_Word, 4, UINT16," I/O Intr"}
{DAMAIAO: LII6V A1_In_Word, 5, UINT16," I/O Intr"}
}
file "../../db/aiRead.template" { pattern
{P, R}
{DAMAIAO: LII1V}
{DAMAIAO: LII2V}
{DAMAIAO: LII3V}
{DAMAIAO: LII4V}
{DAMAIAO: LII5V}
{DAMAIAO: LII6V}
}
file "../../db/longoutInt32.template" { pattern
{P, R, PORT, OFFSET, DATA_TYP E}
{DAMAIAO: LHO1V A0_Out_Word, 0 UINT16}
{DAMAIAO: LHO2V A0_Out_Word, 1 UINT16}
{DAMAIAO: LHO3V A0_Out_Word, 2 UINT16}
{DAMAIAO: LHO4V A0_Out_Word, 3 UINT16}
{DAMAIAO: LHO5V A0_Out_Word, 4 UINT16}
{DAMAIAO: LHO6V A0_Out_Word, 5 UINT16}
}
file "../../db/aoWrite.template" { pattern
{P, R}
{DAMAIAO: LHO1V}
{DAMAIAO: LHO2V}
{DAMAIAO: LHO3V}
{DAMAIAO: LHO4V}
{DAMAIAO: LHO5V}
{DAMAIAO: LHO6V}
}
b) 编辑启动文件st.cmd:
#!../../bin/linux-x86_64/damaiao
#- You may have to change damaiao to something else
#- everywhere it appears in this file
< envPaths
cd "${TOP}"
## Register all support components
dbLoadDatabase "dbd/damaiao.dbd"
damaiao_registerRecordDeviceDriver pdbbase
# use the following commands for TCP/IP
drvAsynIPPortConfigure("damaiao", "192.168.3.82:10000",0,0,1)
modbusInterposeConfig("damaiao", 0,2000, 0)
# Access 6 words as outputs (holding registers)
drvModbusAsynConfigure("A0_Out_Word", "damaiao",1, 6, 0, 6, 0, 1, "damaiao")
# Access 6 words as inputs (holding registers)
drvModbusAsynConfigure("A0_In_Word", "damaiao",1, 3, 0, 6, 0, 100, "damaiao")
# Access 6 words as inputs (input registers)
drvModbusAsynConfigure("A1_In_Word", "damaiao",1, 4, 0, 6, 0, 100, "damaiao")
cd "${TOP}/iocBoot/${IOC}"
dbLoadTemplate("damaiao.substitutions")
iocInit
4) 用以下命令启动这个IOC程序,并且查看加载的记录:
[blctrl@main-machine iocdamaiao]$ ../../bin/linux-x86_64/damaiao st.cmd
epics> dbl
DAMAIAO:LHI1V
DAMAIAO:LHI2V
DAMAIAO:LHI3V
DAMAIAO:LHI4V
DAMAIAO:LHI5V
DAMAIAO:LHI6V
DAMAIAO:LII1V
DAMAIAO:LII2V
DAMAIAO:LII3V
DAMAIAO:LII4V
DAMAIAO:LII5V
DAMAIAO:LII6V
DAMAIAO:LHI1V:Value_RBV
DAMAIAO:LHI2V:Value_RBV
DAMAIAO:LHI3V:Value_RBV
DAMAIAO:LHI4V:Value_RBV
DAMAIAO:LHI5V:Value_RBV
DAMAIAO:LHI6V:Value_RBV
DAMAIAO:LII1V:Value_RBV
DAMAIAO:LII2V:Value_RBV
DAMAIAO:LII3V:Value_RBV
DAMAIAO:LII4V:Value_RBV
DAMAIAO:LII5V:Value_RBV
DAMAIAO:LII6V:Value_RBV
DAMAIAO:LHO1V
DAMAIAO:LHO2V
DAMAIAO:LHO3V
DAMAIAO:LHO4V
DAMAIAO:LHO5V
DAMAIAO:LHO6V
DAMAIAO:LHO1V:SetVoltage
DAMAIAO:LHO2V:SetVoltage
DAMAIAO:LHO3V:SetVoltage
DAMAIAO:LHO4V:SetVoltage
DAMAIAO:LHO5V:SetVoltage
DAMAIAO:LHO6V:SetVoltage
5) 启动CSS图形界面,可以查看这个设备中6个模拟输入通道的输入电压,设置6个模拟输出电压并且回读这个输出电压。
相关文章
- 终于解决了python 3.x import cv2 “ImportError: DLL load failed: 找不到指定的模块” 及“pycharm关于cv2没有代码提示”的问题
- 5-基础构建模块
- Unity SKFramework框架(十二)、Score 计分模块
- LiteOS:剖析时间管理模块源代码
- python select模块详解
- 【pickle】详解python中的pickle模块(常用函数、示例)
- RDIFramework.NET ━ .NET快速信息化系统开发框架 V3.2-模块管理按子系统进行分类管理
- GPS模块数据放入谷歌地图显示,不准
- 微赞模块的加载流程
- Odoo 二次开发教程(二)-模块的基础构建
- 示例可重用的web component方式组织angular应用模块
- 【Python】安装 openpyxl、cmaps、colormap 模块 || turtle中一般可用的颜色示例
- 光伏行业MES系统中的数据采集模块
- EPICS -- autosave模块使用示例