***近遇到一个需求,某厂一台智能型烘干机用到的自动化控制是台达的PLC,台达的DVP16EC要与本设备内置的一台电子式电能表做通讯。PLC做主站(Master),电能表做从站(Slave),一对一通讯,看起来蛮简单,需求也很明了,就是想把电能表的读数(电压、电流、用电量、有功、无功、功率因数、频率等)读取到PLC,然后PLC的编程口连接一个台达的触摸屏做显示。***终实现在触摸屏即可读取电气参数和用电量,不用再去打开电气柜。
OK先说这件事情的结果:客户的PLC型号为DVP16EC带一个RS485口,且的确支持MODBUS通讯,但此款PLC的Modbus程序指令***大只支持读取6个字长度,即12个字节,长度太小,读了ABC三相电流就已经把空间占满了,无法满足需求所以没什么大的意义,***终没能完成这个需求。
不过这个通讯的方法还是可以拿来讲一讲的,毕竟台达PLC做MODBUS的案例在网上少之又少。接下来我们开讲:
1、软件环境:
操作系统:Windows XP SP3 X86
PLC编程软件:WPLSoft V2.50(可以在Delta官网下载)
HMI组态软件:DOPSoft V4.00.10.17(可以在Delta官网下载)
MODBUS调试软件:Modscan32、Modsim32
2、主要设备:
主站:PLC一台
(图2-1,PLC外观图)
从站:电子式电能表一台(支持Modbus RTU)
(图2-2,电子式电能表外观示意图)
从站电子式电能表的通讯参数为9600/8/N/1,寄存器地址部分如下:
(图2-3,电子式电能表寄存器地址表)
3、开始编程:
通讯参数和点表拿到手,就可以开始给PLC编程序了。没错,我***时间拿到了台达DVP的编程手册,找到了下面这一段:
(图3-1,台达DVP编程手册关于API100即MODRD指令的程序范例)
然后我照着这段程序范例写了如下程序:
(图3-2,根据此次需求所写的程序)
这里我们来讲几个关键指令:
首先MOV H81 给寄存器D1120是什么含义
H81即16进制的81,转换成二进制为:10,00,00,01。这四个字节从低到高分别是b0,b1,b2,b3
b0:数据长 b0=0:7 b0=1:8
b2 b1:奇偶性
b2, b1 = 00 :无 (None)
b2, b1 = 01 :奇校验 (Odd)
b2, b1 = 11 :偶校验 (Even)
b3:停止位
b3 = 0:1 bit
b3 = 1:2 bit
b4b5b6b7 波特率
b7 ~ b4 = 0001 (H1) :110 bps
b7 ~ b4 = 0010 (H2) :150 bps
b7 ~ b4 = 0011 (H3) :300 bps
b7 ~ b4 = 0100 (H4) :600 bps
b7 ~ b4 = 0101 (H5) :1200 bps
b7 ~ b4 = 0110 (H6) :2400 bps
b7 ~ b4 = 0111 (H7) :4800 bps
b7 ~ b4 = 1000 (H8) :9600 bps
b7 ~ b4 = 1001 (H9) :19200 bps
b7 ~ b4 = 1010 (HA) :38400 bps
b7 ~ b4 = 1011 (HB) :57600 bps
b7 ~ b4 = 1100 (HC) :115200 bps
所以H81就代表波特率9600,数据位8,停止位1,无校验。
其次MODRD指令
就是用来读寄存器的指令,功能码03,其中三个参数K1,K0,K32含义K代表十进制,后面的数字可根据自己的需求修改
K1:从站地址为1
K0:起始地址0,即从40001开始读
K32:读取32个字(Word)长度
***后就是特殊寄存器
台达PLC自带若干特殊寄存器,我们可以在软件当中打开帮助即可查看:
写完程序后,我用笔记本电脑模拟Modbus从站,用USB转485线将A+ B+两颗线接到PLC右上角的A+ B+上,用modscan打开串口读取Modbus报文,发现报文为 01 03 00 00 00 06 4D 2A,其中01表示从站地址,03表示功能码,00 00 代表起始地址, 00 06代表读取6个字的长度。百思不得其解的是明明我们设置了32个长度,但是报文只读了6个字的长度,于是我修改了K32参数,改成K12,又改成K8,发现报文不变,***后改成K5,报文变成00 05 了。于是又反复查阅资料发现一处关键的描述才瞬间豁然开朗。
原因找到了,***下面一行写着n操作数范围K1≤n≤K6。也就是说,modrd指令只能读6个字的长度。我读了ABC三相电流,三个浮点数,6个字的长度刚好用完。
资料来源于网络,如有侵权,联系删除。
了解更多产品相关信息请关注:台达plc服务商