基于调制解调器与VB的PLC远程通讯系统设计
4 PC端程序设计
4.1 拨号程序设计
PC端将以VB6.0所带的通信控件MSCOMM进行通信软件的开发,利用该控件控制串口实现对MODEM的控制。控制步骤如下:
一.通信参数设置
设置串口端口号,波特率,数据位,停止位,奇偶校验位及设置硬件握手协议,然后向MODEM发出DTR(已准备好)信号一便接管MODEM,程序如下:
If MSComm1.PortOpen Then
MSComm1.DTREnable = True
Else
MSComm1.DTREnable = False
End If
二.对MODEM初始化
发出一些命令来设置参数,其中S0=n(n>=1)自动应答.n为响铃次数;E0/E1关闭/打开命令字符回应;Q0/Q1设置MODEM返回/不返回结果码;M0/M1关闭/打开MODEM扬声器;Ln(n>=0)设置MODEM扬声器音量;P/T设置MODEM脉冲/音频拨号;程序如下:
If MSComm1.PortOpen Then
Do While Not MSComm1.CTSHolding: Loop
TXD= "ATS0=1E1Q0M1L2T" + Chr(13)
MSComm1.Output = TXD
End If
三.进行拨号
向MODEM发出ATD命令,程序如下:
MSComm1.Output="ATD" & "05925998499"+Chr(13)
当发送“ATD”+ 电话号码 + Chr(13)时,MODEM就开始拨号,拨号需要一定的时间,在拨号的过程中可以不断读取MODEM的CD指示灯的状态,当电话拨通后CD指示灯会点亮。并返回“CONNECT + 波特率”的信息。如果MODEM向PC的回应字符串中含有"Connect"或CDHolding属性值变为True(检测出载波),则表示已与远方MODEM连机了,此时可以传输数据。
当电话拨通后,MODEM不再接收AT指令,要使其回到命令状态,则必须发送“+++”信息,使MODEM回到命令状态,然后发送“ATH”+ Chr(13)则可以挂断电话,程序如下:
MSComm1.Output="ATH" +Chr(13)
4.2 通讯程序设计
一.永宏PLC通讯协议
⑴.开头字符(STX):ASCI I码之开始字符STX。
⑵.从站号码:为两位数之16进制数值。
⑶.命令号码:为两位数之16 进制数值,为由主系统要求从系统所执行之动作类别。
⑷.本文资料:本文数据可为0(无本文数据)~500个ASCII字符。
⑸.侦误值(CHECKSUM): 侦误值系将前述~将各ASCII字符之16进制数码值(8位长度)从头至尾依序相加,但不考虑进位,因此最终结果为侦误值。
⑹.结尾字符(ETX):ASCI I码之结尾字符ETX之16进制数码为03H。。
二.读数写数
本系统操作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.Input, 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 String
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连接通讯等。
评论