2000字范文,分享全网优秀范文,学习好帮手!
2000字范文 > 用C语言编写PC与三菱PLC串口通讯 PC与三菱FX系列PLC通信的实现

用C语言编写PC与三菱PLC串口通讯 PC与三菱FX系列PLC通信的实现

时间:2022-01-18 02:29:41

相关推荐

用C语言编写PC与三菱PLC串口通讯 PC与三菱FX系列PLC通信的实现

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

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。