1.硬件连接
一台PC机可与一台或最多16台三菱FX系列通信,PC与PLC之间不能直接连接。如图1a、b为点对点结构的连接,图a中是通过FX-232AW单元进行RS-232C/RS-422转换与PLC编程口连接,图b中通过在PLC内部安装的通信功能扩展板FX-232-BD与PC连接;如图1c所示为多点结构的连接,FX-485-BD为安装在PLC内部的通信功能扩展板,FX-485PC-IF为RS-232C和RS-485的转换接口。除此之外当然还可以通过其它通信模块进行连接,不再一一赘述。下面以PC与PLC之间点对点通信为例。
图1 PC与FX的硬件连接图
2.三菱FX系列PLC通信协议
PC中必须依据所连接PLC的通信规程来编写通信协议,所以我们先要熟悉FX系列PLC的通信协议。
1)数据格式
三菱 FX系列PLC采用异步格式,由1位起始位、7位数据位、1位偶校验位及1位停止位组成,比特率为9600 bps,字符为ASCⅡ码。数据格式如图2所示。
图2数据格式
2)通信命令
三菱FX系列PLC有4条通信命令,分别是读命令、写命令、强制通命令、强制断命令,如表1所示。
表1 FX系列PLC的通信命令表
3)通信控制字符
FX系列PLC采用面向字符的传输规程,用到5个通信控制字符,如表2所示。
表2 FX系列PLC通信控制字符表
控制字符
ASCⅡ码
功能说明
ENQ
05H
PC发出请求
ACK
06H
PLC对ENQ的确认回答
NAK
15H
PLC对ENQ的否认回答
STX
02H
信息帧开始标志
ETX
03H
信息帧结束标志
注:当PLC对计算机发来的ENQ不理解时,用NAK回答。
4)报文格式
计算机向PLC发送的报文格式如下:
STX
CMD
数据段
ETX
SUMH
SUML
其中,STX为开始标志:02H;ETX为结束标志:03H;CMD为命令的ASCⅡ码;SUMH、SUML为按字节求累加和,溢出不计。由于每字节十六进制数变为两字节的ASCⅡ码,故校验和为SUMH与SUML。
数据段格式与含义如下:
注:写命令的数据段有数据,读命令数据段则无数据。
PLC向PC发的应答报文格式如下:
注:对读命令的应答报文数据段为要读取的数据,一个数据占两字节,分上位下位:
数据段:
对写命令的应答报文无数据段,而用ACK及NAK作应答内容。
5)传输规程
PC与FX系列PLC间采用应答方式通信,传输出错,则组织重发。其传输过程
如图3所示。
图3传输过程
PLC根据PC的命令,在每个循环扫描结束处的END语句后组织自动应答,无需用户在PLC一方编写程序。
3.PC通信程序的编写
编写PC的通信程序可采用汇编语言编写,或采用各种高级语言编写,或采用工控组态软件,或直接采用PLC厂家的通信软件(如三菱的MELSE MEDOC等)
下面利用VB6.0以一个简单的例子来说明编写通信程序的要点。假设PC要求从PLC中读入从D123开始的4个字节的数据(D123、D124),其传输应答过程及报文如图4所示。
图4传输应答过程及命令报文
命令报文中10F6H为D123的地址,04H表示要读入4个字节的数据。校验和SUM=30H+31H+30H+46H+36H+30H+34H+03 H=174H,溢出部分不计,故SUMH=7,SUAIL=4,相应的ASCⅡ码为“37H”,“34H”。应答报文中4个字节的十六进制数,其相应的ASCⅡ码为8个字节,故应答报文长度为12个字节。
根据PC与FX系列PLC的传输应答过程,利用VB的MSComm控件可以编写如下通信程序实现PC与FX系列PLC之间的串行通信,以完成数据的读取。MSComm控件可以采用轮询或事件驱动的方法从端口获取数据。在这个例子中使用了轮询方法。
1)通信口初始化
Private Sub Initialize()
MSComm1.CommPort =1
MSComm1.Settings = “9600,E,7,1”
MSComm1.InBufferSize = 1024
MSComml.OutBuffersize = 1024
MSComm1.InputLen = 0
MSComml.InputMode = comInputText
MSComm1.Handshaking = comNone
MSComm1.PortOpen = True
End Sub
2)请求通信与确认
Private Function MakeHandshaking()As Boolean
Dim InPackage As String
MSComml.OutBufferCount = 0
MSComml.InBufferCount = 0
MSComml.OutPut = Chr(&H5)
Do
DoEvents
Loop Until MSComml.InBufferCount = 1
InPackage = MSComml.Input
If InPackage = Chr(&H6)Then
MakeHandShaking = True
Else
MakeHandshaking = False
End If
End Function
3)发送命令报文
Private Sub SendFrame ()
Dim Outstring As String
MSComml.OutBufferCount = 0
MSComml.InBufferCount = 0
Outstrin = Chr(&H2)+″on″+″10F604″+Chr(&H3)+″74″
MSComml.Output = Outstring
End Sub
4)读取应答报文
Private Sub ReceiveFrame()
Dim Instring As String
Do
DoEvents
Loop Until MSComml.InBufferCount = 12
InString = MSComml.Inpult
End Sub