松下工控展销网
◎中国工控展销网    ◎站点地图1 2    ◎繁体版
松下工控展销网
首  页 代理简介 产品中心 资料软件 技术交流 新闻资讯 最新消息 面价查询  
   

PC与松下FP系列PLC的通信

松下PLC代理商。展示松下PLC-型号-报价-技术参数。真诚为您提供松下PLC-资料-手册-编程软件。专业阐述松下PLC-原理-操作-参数-通讯-应用等技术问题。讲述松下PLC-编程-应用-经验实例,松下PLC-维修-故障-报警-故障代码解决方法。

商家信息

产品导航
  松下PLC  
松下变频器
松下电器变频器
松下触摸屏
松下伺服电机
松下小型马达
 
 
 您的位置:>>>技术交流 >>>正文

 
PC与松下FP系列PLC的通信
   相关品牌: 松下
   相关产品: PLC
   更新时间: 2007-6-5 10:21:18
   点击次数: 164
 
一. 引言
PLC作为工业现场的控制器,以其性能稳定,编程简单,结构紧凑,通用性强等优点,已得到了广泛的运用;而计算器在图象处理,报表打印,中文显示等方面具有很强的功能;在现代的控制系统中,已经在很多地方将两者结合起来使用,充分发挥两者的优势,因此,PC和PLC之间的通信显的尤为重要,大多数PLC的通信协议都采用的是MODBUS,而松下FP系列采用的是其专用的MEWTOCOL-COM协议.本文通过实例详细讲解了利用该协议,达到PC和PLC通信的目的.

二. 松下PLC的通信协议
松下FP系列PLC的通信协议是采用松下公司专用的MEWTOCOL-COM协议.在该协议中,数据传送采用的是ASCII码形式,首先由计算器发送指令,PLC接受到指令后,自动进行相应的响应,计算器根据PLC的响应,可以得知PLC是否正确执行了刚刚发送的指令,这样就构成了一个交互式的操作,以确保PC 与 PLC之间的通信正常. MEWTOCOL-COM的指令格式如下:
指令信息:
 


应答信息(正常时):

 

应答信息(发生错误时):

 

其中, “ % ”为起始符号,标记每一帧报文的开始. “ CR ”为结束符号,标记每一帧报文的结束. “ AD ”为每一站PLC的地址,用两位十六进制数表示,如 01 则代表第一台PLC. “ # ”, “ $ ”, “ ! ”标记该帧报文为何种类型,其分别对应为:指令信息,应答信息(正常),应答信息(错误). “ BCC ”为校验码,为两位十六进制数,其初值为“ 0 ”,然后从起始符开始与该帧报文中每一字节按位进行异或运算得到的.

三. PC端VB程序的编写
PC端的程序我们采用VB6.0 和 MSCOMM32 控件来编写.VB的通信控件MSCOMM32提供了简单的串行口通信功能,使用它可以建立与串行口的连接,通过串行口连接到其它设备,发送命令,接受资料,以及监视和响应串行通信中发生的事件和错误等.我们只要通过上位机的程序,向PLC按照MEWTOCOL-COM协议规定的格式发送命令,PLC就可以作出相应的响应.为了使读者能够清楚的了解两者之间的通信,现举例如下:
整个程序的界面如图 (1) 所示.
 


程序的部分代码如下:
Private Sub Cmd_Connect_Click()
Lbl_State.Caption = "正在建立连接,请稍后..."
DoEvents
MSComm1.PortOpen = True ‘建立与串口的连接.
MSComm1.InputLen = 1
MSComm1.RThreshold = 1 ‘设置接受缓冲区接受到一个字符就产生OnComm事件.
TempOutputStr = "%" & Trim(Combo2.Text) & "#RT" ‘Combo2为PLC的站别.
CommandStr = "RT" ‘ “RT”命令用来读取PLC当前的相关信息.
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr) ‘将传送的内容显示在文本框中
Timer1.Enabled = True ‘ 系统开始计时,以判断PC和PLC连接是否正常.
End If
End Sub
Private Sub Cmd_Dt_Click()
Dim I As Integer
Dim TempWd As String
If Option3.Value = True Then
CommandStr = "RD"
For I = 0 To 15
Text1(I).Text = ""
Next I
TempOutputStr = "%" & Trim(Combo2.Text) & "#RD" & "D" & Trim(UCase(Txt_Bof.Text)) & Trim(UCase(Txt_Eof.Text)) ‘” RD “’命令用来读取DT中的数据.
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
Else
CommandStr = "WD"
TempOutputStr = "%" & Trim(Combo2.Text) & "#WD" & "D" & Trim(UCase(Txt_Bof.Text)) & Trim(UCase(Txt_Eof.Text)) ‘” WD “命令用来将数据写入到相应的DT中.
For I = 0 To Val(Txt_Eof.Text) - Val(Txt_Bof.Text)
TempWd = Hex$(Val(Text1(I).Text))
Do While Len(TempWd) <> 4
TempWd = "0" & TempWd
Loop
TempWd = Right$(TempWd, 2) & Left$(TempWd, 2)
TempOutputStr = TempOutputStr & TempWd
Next I
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
End Sub
Private Sub Cmd_Run_Click() ‘控制PLC运行
CommandStr = "RM"
RPBoolean = True
MSComm1.Output = "%" & Trim(Combo2.Text) & "#RMR4A" & Chr$(13)
Txt_PcPlc.Text = "%" & Trim(Combo2.Text) & "#RMR4A"
End Sub
Private Sub Cmd_Stop_Click() ‘控制PLC停止
CommandStr = "RM"
RPBoolean = False
MSComm1.Output = "%" & Trim(Combo2.Text) & "#RMP48" & Chr$(13)
Txt_PcPlc.Text = "%" & Trim(Combo2.Text) & "#RMP48"
End Sub
Private Sub Cmd_TC_Click()
Dim TempWs As String
Dim TempWk As String
If Option9.Value = True And Option11.Value = True Then
CommandStr = "RS" ‘读取定时器/计数器中的默认值
TempOutputStr = "%" & Trim(Combo2.Text) & "#RS" & Trim(UCase(Txt_TC.Text)) & Trim(UCase(Txt_TC.Text))
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
If Option9.Value = True And Option12.Value = True Then
CommandStr = "WS" ‘写入定时器/计数器中的默认值
TempOutputStr = "%" & Trim(Combo2.Text) & "#WS" & Trim(UCase(Txt_TC.Text)) & Trim(UCase(Txt_TC.Text))
TempWs = Hex$(Val(Text2.Text))
Do While Len(TempWs) <> 4
TempWs = "0" & TempWs
Loop
TempWs = Right$(TempWs, 2) & Left$(TempWs, 2)
TempOutputStr = TempOutputStr & TempWs
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
If Option10.Value = True And Option11.Value = True Then
CommandStr = "RK" ‘读取定时器/计数器中的经过值
TempOutputStr = "%" & Trim(Combo2.Text) & "#RK" & Trim(UCase(Txt_TC.Text)) & Trim(UCase(Txt_TC.Text))
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
If Option10.Value = True And Option12.Value = True Then
CommandStr = "WK" ‘写入定时器/计数器中的经过值
TempOutputStr = "%" & Trim(Combo2.Text) & "#WK" & Trim(UCase(Txt_TC.Text)) & Trim(UCase(Txt_TC.Text))
TempWk = Hex$(Val(Text2.Text))
Do While Len(TempWk) <> 4
TempWk = "0" & TempWk
Loop
TempWk = Right$(TempWk, 2) & Left$(TempWk, 2)
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
End Sub
Private Sub Cmd_YR_Click()
Dim TempYR As String
Dim TempValue As String
Dim BinValue As String
Dim HexValue As String
Dim I As Integer
If Option1.Value = True Then
TempYR = "Y"
Else
TempYR = "R"
End If
If Option5.Value = True And Option7.Value = True Then
CommandStr = "RCS" ‘读取单个触点的状态
TempOutputStr = "%" & Trim(Combo2.Text) & "#RCS" & TempYR & Trim(UCase(Txt_YR.Text))
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
If Option6.Value = True And Option7.Value = True Then
CommandStr = "WCS" ‘写入单个触点的状态
If Label22.BackColor = &HC0& Then
TempValue = "1"
Else
TempValue = "0"
End If
TempOutputStr = "%" & Trim(Combo2.Text) & "#WCS" & TempYR & Trim(UCase(Txt_YR.Text)) & TempValue
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
If Option5.Value = True And Option8.Value = True Then
CommandStr = "RCC" ‘读取字单元触点的状态
TempOutputStr = "%" & Trim(Combo2.Text) & "#RCC" & TempYR & Trim(UCase(Txt_YR.Text)) & Trim(UCase(Txt_YR.Text))
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
If Option6.Value = True And Option8.Value = True Then
CommandStr = "WCC" ‘写入字单元触点的状态
For I = 0 To 15
If Label1(I).BackColor = &HC0& Then
TempValue = "1"
Else
TempValue = "0"
End If
BinValue = BinValue & TempValue
Next I
For I = 1 To 16 Step 4
TempValue = BinToHex(Mid$(BinValue, I, 4))
HexValue = HexValue & TempValue
Next I
TempOutputStr = "%" & Trim(Combo2.Text) & "#WCC" & TempYR & Trim(UCase(Txt_YR.Text)) & Trim(UCase(Txt_YR.Text)) & HexValue
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
Txt_PcPlc.Text = TempOutputStr & CalBcc(TempOutputStr)
End If
End Sub
Private Sub MSComm1_OnComm()
Dim I As Integer
Dim TempRec As String
Dim TempInputSingle As String
Dim TempValue As String
Dim BinValue As String
TempInputSingle = MSComm1.Input ‘读取接收缓冲区中的内容,并清空缓冲区
TempInput = TempInput + TempInputSingle
If TempInputSingle = Chr$(13) Then ‘当接收到回车符时,表示一帧内容接受完毕.
If InStr(1, TempInput, "!") <> 0 Then
Lbl_State.Caption = "命令参数错误,请输入正确的参数!"
TempInput = ""
Exit Sub
Else
TempInput = Trim(TempInput)
Txt_PlcPc.Text = TempInput ‘将接收到的信息显示在文本框中.
Select Case CommandStr ‘分类对接收到的信息进行处理.
Case "RT"
Select Case Mid$(TempInput, 7, 2)
Case "20"
Lbl_Kind.Caption = " FPΣ系列"
Case "03"
Lbl_Kind.Caption = " FP3 系列"
Case "02"
Lbl_Kind.Caption = " FP5 系列"
Case Else
Lbl_Kind.Caption = "未知系列"
End Select
Lbl_Version.Caption = Mid$(TempInput, 9, 2)
Lbl_Size.Caption = Mid$(TempInput, 11, 2) & "K"
If Mid$(TempInput, 15, 9) = "000000000" Then
Lbl_Error.Caption = "无错误!"
Else
Lbl_Error.Caption = "PLC 有错误!"
End If
If Mid$(TempInput, 14, 1) = "1" Then
Shape_Run.FillColor = &HC0&
Shape_Stop.FillColor = &H80FFFF
Else
Shape_Run.FillColor = &H80FFFF
Shape_Stop.FillColor = &HC0&
End If
Timer1.Enabled = False
Lbl_State.Caption = "连接成功!"
Case "RM"
If RPBoolean = True Then
Shape_Run.FillColor = &HC0&
Shape_Stop.FillColor = &H80FFFF
Else
Shape_Run.FillColor = &H80FFFF
Shape_Stop.FillColor = &HC0&
End If
Case "RD"
For I = 0 To Len(TempInput) - 10 Step 4
TempRec = Mid$(TempInput, 7 + I, 4)
Text1(I / 4).Text = Val("&H" & Right(TempRec, 2) & Left(TempRec, 2))
Next I
Case "RCS"
TempRec = Mid$(TempInput, 7, 1)
If TempRec = "1" Then
Label22.BackColor = &HC0&
Else
Label22.BackColor = &HFFFF&
End If
Case "RCC"
TempRec = Mid$(TempInput, 7, 4)
For I = 1 To 4
TempValue = HexToBin(Mid$(TempRec, I, 1))
BinValue = BinValue & TempValue
Next I
For I = 0 To 15
If Mid$(BinValue, I + 1, 1) = "1" Then
Label1(I).BackColor = &HC0&
Else
Label1(I).BackColor = &HFFFF&
End If
Next I
Case "RS"
TempRec = Mid$(TempInput, 7, 4)
Text2.Text = Val("&H" & Right(TempRec, 2) & Left(TempRec, 2))
Case "RK"
TempRec = Mid$(TempInput, 7, 4)
Text2.Text = Val("&H" & Right(TempRec, 2) & Left(TempRec, 2))
End Select
TempInput = ""
End If
End If
End Sub
Private Sub Timer1_Timer()
TryNum = TryNum + 1
If TryNum = 4 Then ‘总共发送三次连接信息,如无响应,则提示错误!
Lbl_State.Caption = "PC 与 PLC 通讯失败,请检查通讯线路是否正常!"
If MSComm1.PortOpen = True Then MSComm1.PortOpen = False
Timer1.Enabled = False
TryNum = 0
Exit Sub
End If
MSComm1.Output = TempOutputStr & CalBcc(TempOutputStr) & Chr$(13)
End Sub
Public Function CalBcc(ByVal InputStr$) As String '计算校验码
Dim I As Integer
Dim TempStr As Byte
TempStr = 0
InputStr$ = Trim(InputStr$)
For I = 1 To Len(InputStr$)
TempStr = TempStr Xor Asc(Mid(InputStr$, I, 1))
Next I
CalBcc = Right$("0" & Hex$(TempStr), 2)
End Function
以上程序在Win98+VB6.0中调试通过,串行通信参数须设置为 “9600,o,8,1”.

四. 结论
PC不仅能实现一般人机界面的相关功能,而且还可以处理和统计大量的数据,另外,通过网络,也可以实现远程控制.本文只是拋砖引玉,读者可以根据实际的需要,利用MEWTOCOL-COM协议,制作出现场所需要的控制程序.

五. 参考文献
1. 松下电工 MEWTOCOL-COM通信协议 2002
2. 松下电工 FPΣ系列编程手册 2002

中国工控展销网  E-mail:kefu@gkooo.com