zl程序教程

您现在的位置是:首页 >  系统

当前栏目

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个模拟输出电压并且回读这个输出电压。