基于调制解调器与VB的PLC远程通讯系统设计
二.读数写数
本系统操作PLC的关键数据主要是水位的设定值PV=R0和当前值CV=R1,即要对暂存器R0进行写操作,R1进行读操作;
依照协议VB设计的通讯程序必须指定一个命令码,向PLC请求数据读取,查的该命令码为“46”,解释为:连续多个缓存器之数据读取。读取R1的PC命令的ASCII码写法为:
“STX+ 01(站号)+46(命令码)+01(连续数据个数)+R00001(数据开始地址)+LRC(侦误值)+ETX”
依照协议VB设计的通讯程序必须指定一个命令码,对PLC缓存器数据写入,查的该命令码为“47”,解释为:连续多个缓存器之数据写入。写入R0的PC命令的ASCII码写法为:
“STX+ 01(站号)+47(命令码)+01(连续数据个数)+R00000(数据开始地址)+XXXX(写入的数据资料,16进制)+LRC(侦误值)+ETX”
读取当前值CV=R1,程序如下
Private Sub Timer1_Timer()
MSComm1.Output= Chr(2)+ “014601R00001”+ Lrc(“014601R00001”)+Chr(3)
Delay (10) ‘延时
CV = Val(“&H” + Mid(MSComm1.bbbbb, 7, 4)) ’数据处理,R0放于CV
CV.Text = CV
End Sub
写入设定值PV=R0,程序如下
Private Sub Command1_Click()
If Len(Hex(PV.Text)) = 4 Then PV = Hex(PV.Text)
If Len(Hex(PV.Text)) = 3 Then PV = “0” + Hex(PV.Text
If Len(Hex(PV.Text)) = 2 Then PV = “00” + Hex(PV.Text)
If Len(Hex(PV.Text)) = 1 Then PV = “000” + Hex(PV.Text) ‘10进制转换16进制
MSComm1.Output=Chr(2)+ “014701R00000”+ PV + +Lrc(“014701R00000” & PV)+Chr(3)
End Sub
三.侦误值(CHECKSUM)计算
为VB的编程方便,把该计算做成单独一个子程序,依所有数据累加,舍弃进位的规则VB的LRC编程如下:
Private Function Lrc(Dats) As bbbbbb
Dim i
Dim Sum
Sum =2
For i = 1 To Len(Dats)
Sum = Sum + Asc(Mid(Dats, i, 1))
Next i
Lrc = Right(“0” + Hex(Sum + 2), 2)
End Function
5结束语
采用基于MODEM通讯的设计极方便地实现该小电站生厂调度,在这种只需短时间连接控制的系统应用上可以大幅度地减小通讯成本,具有一定的推广价值。另外,通过MODEM的连接,利用永宏编程软件可以实现该设备的远程程序调试修改,通过两个MODEM还可以实现两台远程PLC的CPU连接通讯等。