本文记录Codesys控制器使用标准的Modbus库,与支持ModbusRTU的称重变送器进行通讯的案例。
1.首先添加Modbus COM设备,以及配置串口的相关参数,详细步骤可点击下方链接。
2. 添加设备完成后,通过查询称重变送器手册,本例使用的是SSM-FDD数字放大器。
翻查手册可以找到Modbus RTU协议,找到需要使用的内存地址如下:
本例中需要用到的功能包括:【净重】、【零点内码值】、【零点测量值】、【增益内码值】、【增益测量值】、【手动置零范围】、【执行手动置零】。
其中【净重】为物料当前重量;【零点内码值】、【零点测量值】、【增益内码值】、【增益测量值】为称校准时使用;
3. 根据手册选取需要使用的功能,根据内存地址和数据长度在【Modbus从站通道】配置上进行设置。
内存地址解析:
如【净重】,在说明书中内存地址为40083(082),将082转换成16进制为0x0052,因此在通道配置中读偏移地址为0x0052,数据长度查阅说明书可知为两个字,则数据长度为2。其他参数同理,从10进制转换成16进制后填入对应的通道配置中即可。
4.新建变量表,声明用于存放称重变送器需要使用的数据。
VAR_GLOBAL
// 零点对应的 AD 内码值;范围:-8000000~8000000
// 写入:0x7fffffff 将当前内码设为零点内码
whbCalibrateCode0: WORD := 16#7FFF;
wlbCalibrateCode0: WORD := 16#FFFF;
// 零点对应的测量值;范围:-8000000~8000000
whbCalibrate0: WORD := 0;
wlbCalibrate0: WORD := 0;
// 增益对应的 AD 内码值;范围:-8000000~8000000
// 写入:0x7fffffff 将当前内码作为增益内码
whbCalibrateCode1: WORD := 16#7FFF;
wlbCalibrateCode1: WORD := 16#FFFF;
// 增益对应的测量值;范围:-8000000~8000000
whbCalibrate1: WORD;
wlbCalibrate1: WORD;
// 最大称量值;范围:0~8000000;使用称台功能前需
// 先设置此值
whbCapacity: WORD := 16#2D;
// 写入3000000,即300.0000
wlbCapacity: WORD := 16#C6C0;
// 设置手动清零的范围;单位为满量程的百分比;写 0
// 后手动清零功能无效
wZeroRange: WORD := 100;
// 写入 0x01 后执行手动置零操作
wManualZero: WORD := 16#01;
// 毛重减去皮重后的值;负数采样标准补码方式,,读取净重,两个字
whbNetWeight: WORD;
wlbNetWeight: WORD;
// 砝码重量转双字结果
stCalibrate1: st双字结构;
// 净重,整形,0.1g
diNetProcess: DINT;
// 净重,浮点数,单位kg
fNetProcess: REAL;
// 净重(滤波后),浮点数,单位kg
fNetFilter: REAL;
END_VAR
在PLC全局变量表中,添加零点标定,砝码标定,秤盘清零,量程写入等触发变量的声明。
在ModbusSlaveIO映射中,输入通讯映射变量。
5.在程序中处理读回数据,以及触发写入数据。
(*变送器常量值赋值*)
变送器1.whbCalibrateCode0:=16#7FFF;
变送器1.wlbCalibrateCode0:=16#FFFF;
变送器1.whbCalibrate0:=16#0000;
变送器1.wlbCalibrate0:=16#0000;
变送器1.whbCalibrateCode1:=16#7FFF;
变送器1.wlbCalibrateCode1:=16#FFFF;
(*砝码重量数据转换*)
变送器1.stCalibrate1:=fc_UDI转字结构(udiInput:=REAL_TO_UDINT(fHMI.r32砝码重量*10000));
变送器1.whbCalibrate1:=变送器1.stCalibrate1.HighWord;
变送器1.wlbCalibrate1:=变送器1.stCalibrate1.LowWord;
(*300kg最大量程,清零范围,清零指令赋值*)
变送器1.whbCapacity:=16#002D;
变送器1.wlbCapacity:=16#C6C0;
变送器1.wZeroRange:=100;
变送器1.wManualZero:=16#0001;
(*净重数据两个字节转换成DINT整形,然后净重数据转成浮点数*)
变送器1.diNetProcess:=fc_2字转DINT(wHighWord:=变送器1.whbNetWeight,wLowWord:=变送器1.wlbNetWeight);
变送器1.fNetProcess:=DINT_TO_REAL(变送器1.diNetProcess)*0.0001;
fHMI.r32净重:=变送器1.fNetProcess;
fHMI.r32净重滤波后:=变送器1.fNetFilter;
(*变送器标定命令*)
IF PLC.变送器_通讯监控_1.x初始化完成 THEN
PLC.b零点标定:=bHMI.b启用校称 AND bHMI.b零点标定 AND NOT b运行;
PLC.b砝码标定:=bHMI.b启用校称 AND bHMI.b砝码标定 AND NOT b运行;
PLC.b秤盘清零:=bHMI.b秤盘清零 AND NOT b运行;
END_IF
至此,控制器与称重变送器的通讯配置与程序编写完成,可通过触发【PLC.b零点标定】和【PLC.b砝码标定】对秤盘进行校称操作;秤盘当前重量存放于【变送器1.fNetProcess】中,每200ms读取一次;还可根据需要添加去皮、清皮等功能,只需找到对应的通讯地址,添加通讯配置即可实现。