Codesys—Modbus RTU称重变送器通讯案例

本文记录Codesys控制器使用标准的Modbus库,与支持ModbusRTU的称重变送器进行通讯的案例。

1.首先添加Modbus COM设备,以及配置串口的相关参数,详细步骤可点击下方链接。

Codesys下标准Modbus库的应用示例

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读取一次;还可根据需要添加去皮、清皮等功能,只需找到对应的通讯地址,添加通讯配置即可实现。

  • 23
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值