1引言
随着计算机和通讯技术的发展,在工业测量和控制中广泛需要远程通讯。远端PLC等下位机做生产控制,本地计算机需要实时监测或参与控制生产现场的参数。实现以上要求的一个简便的途径是利用覆盖面广泛的公用电话网,使PLC等下位机利用调制解调器(MODEM)和计算机的调制解调器连接通讯,即可完成硬件上的连接。如图1所示。在软件方面,由远端下位机软件控制和远程监控站软件两部分组成。考虑到本地监控站软件只做数据监测或少许控制且编程相对简单,所以本地监控站的编程软件可以直接用高级语言。
2系统概述
本文以一个实际的小水电站的泻水闸门程控工程为例,着重叙述永宏PLC和PC做远程通讯的实现细节。系统的下位机控制采用永宏公司的FBs系列PLC对水库泻水闸门进行开度检测和开度控制,监控站的界面编程采用VB6.0编写。
硬件配置:远端FBs-CB25+ FBs-10MAU+ECOM外置MODEM+PWS1711
本地PC(含普通内置MODEM)
该系统主要控制要求,通过FBs-10MA外接一个旋转编码器检测闸门所在位置,然后跟据现场人机界面或者PC端(下游5Km处)的设定位置来控制牵引闸门的马达正反转,从而使闸门上升或下降到指定的位置。FBs-CB25所扩展得到的通讯口2(RS485)用于PWS1711的通讯,通讯口1(RS232)用于连接MODEM,另外,主机上的可USB口用于连接调试用的笔记本电脑。
图1系统组成
3调制解调器工作方式和设定
3.1 调制解调器工作原理
调制解调器分成两种模式,命令模式和联机模式。当调制解调器没有和其它设备连接时,其处于命令模式,这时下达给调制解调器的指令时作调制解调器本身设定或者动作用的。当调制解调器已经和其它的设备连接上时,此时调制解调就是处于联机模式,所有在此时由计算机送到调制解调器的讯息都将由经电话线传送到其它设备上。
用于控制调制解调器的特定指令集被称为“AT指令集”,通过该指令集,从最基本的音量控制到内建参数设置的改变,都可以由VB经过串行端口而对调制解调器下达控制指令。AT命令集是调制解调器通讯接口的工业标准。所有的AT命令都以字符AT开始,作为前缀。前缀AT用以引起调制解调器的注意(Attention)检测计算机串行通讯口发送信号的速率,识别字符格式,包括字符长度和奇偶设定等。
调制解调器拨号之后,等待对方调制解调器送来的载波信号。如果在一给定时间内没有检测到载波, 调制解调器自动释放线路并送回结果码NOCARRIER,如果检测到载波信号, 调制解调器即送结果码CONNECT + 波特率,就进入联机状态,即可与远方系统进行通讯。
3.2 PLC连接调制解调器原理及其设置
在该系统中, PC做为主站,必须控制调制解调器主动拨号,另外,在确认调制解调器和PLC的调制解调器联机成功后控制它进入联机模式,开始存取PLC数据。主站控制调制解调器拨号连接细节见下节,这里详述PLC端对调制解调器的设置方法。
PLC端PLC上电后必须初始化调制解调器,设置成自动应答来电状态。在这里把PLC初始化调制解调器的AT指令组合称为“MODEM驱动程序”。永宏PLC通过Port1来控制调制解调器,并把这种软件界面称为调制解调器专用界面。如图2设定或者设定特殊暂存器R4149的高八位为55H就可以把Port1设置为调制解调器专用界面,在该界面下PLC会启用“MODEM驱动程序”,此时,虽CPU仍然使用永宏〝标准通讯驱动程序〞来管理Port1的通讯,但必须通过调制解调器来联机,在通讯进行前,Por t1主控权是交由〝MODEM驱动程序〞管理,此时无法对PLC作任何存取动作。“MODEM驱动程序”即将调制解调器设为接收模式,并等待远方调制解调器拨号进来,一旦收发双方调制解调器联机成功,则PLC立即脱离接收模式,而进入联机状态,Port1控制权交由永宏〝标准通讯驱动程序〞管理。此时远方调制解调器便可任意存取或控制此PLC主机了。
图2 本地调制解调器设置
调制解调器设置如图2所示,在PLC联机状态下,选取菜单中的“PLC”→“设定”→“Port1设定”来到图2,选择单选框的第二项“透过MODEM作远程CPU_Link”,该PLC一上电就通过自带的“MODEM驱动程序”把Port1设置为调制解调器专用界面。另外,通讯格式设置为同调制解调器相同的N,8,1,为提高通讯效率可以把通讯速率设置为38400bps,或者更高(最高为115200bps)。
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" + Ch r(13)
MSComm1.Output = TXD
End If
三.进行拨号
向MODEM发出ATD命令,程序如下:
MSComm1.Output="ATD" & "05925998499"+Ch r(13)
当发送“ATD”+ 电话号码 + Ch r(13)时,MODEM就开始拨号,拨号需要一定的时间,在拨号的过程中可以不断读取MODEM的CD指示灯的状态,当电话拨通后CD指示灯会点亮。并返回“CONNECT + 波特率”的信息。如果MODEM向PC的回应字符串中含有"Connect"或CDHolding属性值变为True(检测出载波),则表示已与远方MODEM连机了,此时可以传输数据。
当电话拨通后,MODEM不再接收AT指令,要使其回到命令状态,则必须发送“+++”信息,使MODEM回到命令状态,然后发送“ATH”+ Ch r(13)则可以挂断电话,程序如下:
MSComm1.Output="ATH" +Ch r(13)
4.2 通讯程序设计
一.永宏PLC通讯协议
永宏PLC 通讯讯息格式可概分为6个数据域位, 如下图3所示,具体解释如下:
图 3 永宏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= Ch r(2)+ “014601R00001”+ Lrc(“014601R00001”)+Ch r(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=Ch r(2)+ “014701R00000”+ PV + +Lrc(“014701R00000” & PV)+Ch r(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连接通讯等。