自动化软件实战乐园(100002)Vb6.0与三菱PLC的通信 点击:953 | 回复:1



PLC酷客

    
  • [版主]
  • 精华:9帖
  • 求助:31帖
  • 帖子:1460帖 | 7990回
  • 年度积分:457
  • 历史总积分:59176
  • 注册:2004年7月13日
发表于:2012-11-13 19:36:33
楼主

Vb6.0与三菱PLC的通信

串行通信程序时,有两种方法,一种是用Windows API函数,另一种是用VB支持的通信控件MSCOMM.OCX。使用MSCOMM.OCX控件编程方便,具有更完善的发送和接收功能。这里采用了MSCOMM.OCX控件。

项目选用三菱FX2N-64MRPLCSC-09电缆作为计算机与PLC通信的连线。连接电缆的9针端连接在计算机串口上,另一端连接在PLCRS-422编程口。          

 

      通信格式:

 起始符

命令字

首地址

数据区

结束符

和校验

      波特率9600,偶校验,7位数据位,一位停止位。

一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码—ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数STXCHR2))和ETXCHR3))分别表示该字符帧的起始标起和结束标志

(1) 起始字元STXASCII码的起始字元STX对应的16进制数位0x02。无论命令信息还是回应信息,它们的起始字元均为STX,接收方以此来判知传输资料的开始。

(2) 命令号码:为两位16进制数。所谓命令号码是指上位机要求下位机所执行的动作类别,例如要求读取或写入单点状态、写入或读取暂存器资料、强制设定、运行、停止等。在回应信息中,下位机会将上位机接收到的命令号码原原本本的随同其它信息一同发送给上位机。

(3) 元件首地址:对应要操作的元件的相应的地址。如从D123单元中读取数据时,要把它对应的地址:0x10F6发送给PLC

(4) 元件个数:一次读取位元件或字元件的数量。

(5) 结束字元(ETX):ASCII码的结束字元ETX对应的16进制数为0x03。无论命令信息还是回应信息,它们的结束字元均为ETX,接收方以此来判知此次通讯已结束。

(6) 校验码(Checksum):校验码是将STX-ETX之间的ASCII字元的16进制数值以“LRCLongitudinal Redundancy Check法计算出1Byte长度(两个16进制数值00-FFH)的校验码。当下位机接收到信息后,用同样的方法计算出接收信息的校验码,如果两个校验码相同,则说明传送正确。

FX2系列与计算机之间的通信是以主机发出的初始命令,PLC对其做出回答响应进行通信的,PLC无权命令

三菱FX系列PLC编程口通信协议总览

 该协议实际上适用于PLC编程端口以及 FX-232AW 模块的通信。通讯格式:

命令

命令码

目标设备

读元件

"0"    CHR(2)

X,Y,M,S,T,C,D

写元件

"1"    CHR(3)

X,Y,M,S,T,C,D

置位

" 7"    CHR( 37)

X,Y,M,S,T,C

复位

"8"    CHR(38)

X,Y,M,S,T,C

传输格式: RS232C波特率:9600bps奇偶even校验:累加方式(和校验)字符: ASCII16进制代码:

ENQ

05H

请求

ACK

06H 

PLC正确响应(对了)

NAK

15H  *

PLC错误响应(错了)

STX

02H

报文开始

ETX

03H

报文结束

 

 说明:1.帧中的BYTES表示需要读取或者写入的字节数。2.地址算法上有说明。3.累加和是从STX后面一个字节开始累加到ETX的和。

 

三菱FX系列PLC编程口通信协议总览

例子:
STX ,CMD ,ADDRESS, BYTES, ETX, SUM
02H, 30H, 31H,30H,46H,36H, 30H,34H, 03H, 37H,34H
SUM=CMD+......+ETX

30h+31h+30h+46h+36h+30h+34h+03h=74h;
累加和超过两位取低两位
1
DEVICE READ(读出软设备状态值)
计算机向PLC发送:
 命令 首地址 位数  和校验
STX CMD GROUP ADDRESS BYTES ETX SUM
例子:从D123开始读取4个字节数据
02h 30h 31h,30h,46h,36h 30h,34h 03h 37h,34h
地址算法:address=address*2+1000h
再转换成ASCII
31h,30h,46h,36h
PLC
返回
STX 1ST DATA 2ND DATA ..... LAST DATA ETX SUM
注:最多可以读取64个字节的数据
例子:从指定的存储器单元读到3584这个数据
02h 33h 35h 38h 34h 03h 44h,36h
 
2
DEVICE WRITE(向PLC软设备写入值)
 命令 首地址 位数 数据  和校验
STX CMD GROUP ADDRESS BYTES 1ST DATA 2ND DATA ...... LAST DATA ETX SUM
例子:向D123开始的两个存储器中写入1234,ABCD
02h 31h 31h,30h,46h,36h 30h,34h 33h,34h,31h,32h,43h,44h,41h,42h 03h 34h,39h
PLC
返回
ACK (06H) 
接受正确
NAK (15H) 
接受错误
 
3
、位设备强制置位/复位
FORCE ON
置位
 命令 地址  和校验
STX CMD ADDRESS ETX SUM
02h 37h address 03h sum
FORCE OFF
复位
 命令 地址  和校验
STX CMD ADDRESS ETX SUM
02h 38h address 03h sum
 
PLC
返回
ACK(06H) 
接受正确
NAK(15H) 
接受错误
设备强制中的地址公式:Address=Address/8+100h
 
说明:
1.
帧中的BYTES表示需要读取或者写入的字节数。
2.
地址算法上有说明。
3.
累加和是从STX后面一个字节开始累加到ETX的和。
三菱FX系列PLC编程口通信源代码
fx_comm.h 
FX
系列PLC四种通信模式的特性
  首先讲讲FX系列PLC的通信方式。
  FX系列PLC根据使用的通信模块与协议不同,分为以下四种通信模式:
  1PLCN:N通信方式
  2PLC双机并联通信方式
  3PLC与计算机专有协议通信方式(无须梯形图,电脑直接读写操纵PLC) 
  4PLC与计算机无协议通信方式(梯形图RS指令方式,可自定义通信协议
  以下将详细列出各通信模式的特性:
  N:N网络 PLC并联 专用协议计算机连接 无协议通信
传输标准 RS485 RS485/RS422 RS485/RS422RS232
传输距离 500m RS485/RS422:500mRS232:15m
连接数量 8 1:1 1:N(N<=16) 1:1
通信方式 半双工 FX,FX2c,FXon:半双工FX2n: 全双工
数据长度 固定 7bit/8bit
校验  //
停止位  1bit/2bit
波特率 38400bps 19200bps 300/600/1200/2400/4800/9600/19200
头字符 固定 无/有效
尾字符  
控制线 ------ 
协议 --- 格式1/格式
和校验 固定 无/有效 
适用机型 FX2n,FXon FX2n,FX,FX2c FX2n,FXon,FX,FX2c
FX
系列PLC专用协议通信指令一览
   
以下将详细列出PLC专用协议通信的指令:
指令 注释  
BR 
1点为单位,读出位元件的状态  
WR 
16点为单位,读出位元件的状态,或以1字为单位,读出字元件的值  
BW 
1点为单位,写入位元件的状态  
WW 
16点为单位,写入位元件的状态,或以1字为单位,写入值到字元件  
BT 
1点为单位,SET/RESET 位元件  
WT 
16点为单位,SET/RESET 位元件,或写入值到字元件  
RR 
控制PLC运行RUN  
RS 
控制PLC停止STOP  
PC 
读出PLC设备类型  
TT 
连接测试  

注:位元件包括X,Y,M,S以及T,C的线圈等;
  字元件包括D,T,C,KnX,KnY,KnM等。
FX
系列PLC专用协议通信指令格式详解
 约定说明:
     ENQ为请求标志,ASCII5,VB中以chr(5)表示;
     ACK为正确标志,ASCII6,VB中以chr(6)表示; 
     STX为请求标志,ASCII2,VB中以chr(2)表示;
     EXT为请求标志,ASCII3,VB中以chr(3)表示; 
     表格中红色字为需要求和效验的部分;
     和效验为每一项的ASCII值的总和转换成十六进制后区低两位;
     站号、PLC号、元件数量、和效验都是以十六进制表示;
     等待延时为0-150毫秒,以十六进制0H-FH表示,如100msAH
  1、批量读出位元件--BR指令
    格式:
  1 2 3 4 5 6 7 8             15 16 17
PC
侧: ENQ 站号 PLC BR 延时 首地址 数量 和效验       ACK 站号 PLC
PLC
侧:         STX 站号 PLC 数据 EXT 和效验   
                  9 10 11 12 13 14      
   【】 上述中:1"PLC"系统默认为"FF"2"首地址 "应以十进制表示,如首地址"X0018"表示从X寄存器的第18地址单元开始读取I/O量;3"数量"表示读取的I/O量个数;4"和效验"是指从"站号""数量"之间的各代码的ASCII码的累加和;5PLC侧的响应码中"和效验"是指从"站号""EXT"之间的各代码的ASCII码的累加和。6、可以读出"X""Y""M"寄存器的内容。
例如:要读出站号为0Fx2n系列PLCX00X089点的状态值,延时100ms,假设采用Communication Format(D8120)Format 1 方式::
  请求 站号 PLC 命令 延时 元件首地址 元件数量 和效验
  : ENQ 0 0 F F B R A X 0 0 0 0 0 9 4 2
ASCII
: 05H 30H 30H 46H 46H 42H 52H 41H 58H 30H 30H 30H 30H 30H 35H 34H 32H
  您只要将以上兰色部分的代码以字符串形式(VB中可以表示为CHR(5)&" 00FFBRAX00000942")发送到PLC,就会有正确的回应信息,如下: 
  站号 PLC 元件首地址  和效验
 : STX 0 0 F F 0 0 1 1 0 1 1 0 1 EXT 0 5
ASCII
: 02H 30H 30H 46H 46H 30H 30H 31H 31H 30H 31H 31H 30H 31H 03H 30H 35H
 
  若发送码有误,则有以下回应:
  站号 PLC 和效验
 : NAK 0 0 F F 0 6
ASCII
: 15H 30H 30H 46H 46H 30H 36H

2、批量读出字元件--WR指令
  格式:
  1 2 3 4 5 6 7 8             15 16 17
PC
侧: ENQ 站号 PLC WR 延时 首地址 数量 和效验       ACK 站号 PLC
PLC
侧:         STX 站号 PLC 数据 EXT 和效验   
                  9 10 11 12 13 14      
  该命令使用方法与1(BR)命令相同,不再赘述。
  3、批量写入位元件--BW指令
  格式:
  1 2 3 4 5 6 7 8 9      
PC
侧: ENQ 站号 PLC BW 延时 首地址 数量 写入值 和效验   
PLC
侧:           ACK 站号 PLC
                    10 11 12
  4、批量写入字元件--WW指令(M寄存器100单元置"1"
  格式:01FFWWAM01000100010C
  1 2 3 4 5 6 7 8 9      
PC
侧: ENQ 站号 PLC WW 延时 首地址 数量 写入值 和效验   
PLC
侧: 05H 01 FF  A M0100 01 0001  0C ACK 站号 PLC
                    10 11 12

一个例一:

 在新建工程的表单上添加MSCOMM.OCX控件,初始化程序:

     Private Sub Form_Load()

     MSComm1.CommPort = 1 ‘选择COM1

     MSComm1.Settings = "9600,e,7,1" 

     End Sub

 

数据读取子程序:

Public Function GetData(ByVal StartAddress As String, ByVal GetBytes As Integer, ByVal Hex_Bytes As String) As String  定义读取子程序

  MSComm1.InputLen = GetBytes * 2 + 4

  MSComm1.Output = STX + CMD_Read + StartAddress + Hex_Bytes + ETX + GetSumChk(CMD_Read + StartAddress + Hex_Bytes + ETX)

   ‘传送数据组成:起始符+命令+首地址+数据位+结束符+和检验码

  GetData = MSComm1.Input

  MSComm1.InBufferCount = 0

  MSComm1.InputLen = 0

End Function

    如需读取数据,通过调用GetData子程序。参数设置程序可参考读取子程序,只是改变命令而已。

Access97数据库中包含三个表单,包括参数表、记录表、报警记录表。

 

通过如下子程序是将实际称量值(记录表)更新到数据库:

Private Sub SaveData()

Dim i As Integer

Dim valid As Boolean

On Error Resume Next

valid = True

Data1.Recordset.AddNew

Data1.Recordset.Fields("dtime") = TimeSerial(OnHour, OnMinute, OnSecond)

Data1.Recordset.Fields("systime") = Time      ‘系统时间

Data1.Recordset.Fields("get_xl") = LF(1)      ‘小料当前称量值

Data1.Recordset.Fields("get_fjs") = LF(2)       ‘方解石当前称量值

Data1.Recordset.Fields("get_cs") = LF(3)      ‘长石当前称量值

Data1.Recordset.Fields("get_sys") = LF(4)      ‘石英砂当前称量值

Data1.Recordset.Fields("get_cj") = LF(5)        ‘纯碱当前称量值

On Error Resume Next

Data1.Recordset.Update                    ‘更新数据库记录

Data1.Recordset.MovePrevious

End Sub

程序中,LF(i)变量对应为图二系统参数表单中实称值。

保存参数子程序只是对数据库操作,程序结构可参考以上子程序。

上位机与PLC通信质量的好坏,对系统的安全可靠运行影响极大,因此,编写程序时,除了在两者之间的通信协议上保持绝对一致和采取相应的容错技术外,还要考虑系统的整体容错技术,防止系统的不正常。

VBPLC通信程序(欧姆龙PLC

1        初始化程序

Mscomm1.Commport=2           ’ 选择COM2

Mscomm1.Settings=”9600,N,8,2”   ’ 设置通信参数

Mscomm1.Inputlen=0             ’ 读入接收缓冲区全部字符 

Mscomm1.OutbufferSize=256      ’ 设置发送缓冲区大小

Mscomm1.InbufferSize=512       ’ 设置接收缓冲区大小

Mscomm1.PortOpen=True          ’打开COM2

2        发送命令程序

比如读取节点号03PLCIR000IR009的内容,并放到tag1字符串变量中,此时有:

Dim Command, node, begin, number as string

Dim Answerlen as integer

node=”03”            ’节点号

Command=”RR”       ’命令为读IR

begin=”0000”          ’IR000开始

number=10              ’读取长度

Answerlen=51           ’计算接收字符串长度

进行命令发送和接收应答处理:

Dim  FCS, I as integer

Dim  s ,f as string

s=”@”+node+Commad+begin+number

FCS=0

For i=1 to Len(s)

   FCS=FCS xor Asc(Mid$(s,i,1) )      ’帧校验码FCS

Next i

f=Hex$(FCS)

If  Len(f)=1  Then  f=”0”+f

Commfrm.MSComm1.Output=s + f + ”*” + CHR$(13)   ’命令帧发送

Do

         Dummy=DoEvents()

Loop Untill Commfrm.MSComm1.InbufferCount >= Answerlen   ’等待应答帧

Do tag1= Commfrm.MSComm1.Input

Loop Untill Commfrm.MSComm1.InbufferCount=0  ’读完应答帧

上述程序具有相当的通用性,对于其它设备不同的只是各自的数据帧格式,因而只需做相应少量修改即可。

 

下面介绍MSCOMM控件的属性:
*CommPort:设定通信连接端口代号,程序必须指定所要使用的串行端口号,Windows系统使用所设定的端口与外界通信。
*PortOpen:
设定通信口状态,若为真,通信端口打开,否则关闭。
*Settings:
设定通信口参数,其格式是"bbbb,p
,d,s"
,其中bbbb为通信速率(波特率)p为通信检查方式(奇偶校验) d 为数据位数,s为停止位数,其设定应与PLC的设定一致。
*Input:
将对方传送至输入缓冲区的字符读入到程序。
*Output:
将字符写入输出缓冲区。
*InBufferCount:
传回接收缓冲区中的字符数。
*OutBufferCount:
传回输出缓冲区中的字符数。
*InputLen:
设定串行端口读入字符串的长度。
*InputMode:
设定接收数据的方式。
*Rthreshold:
设定引发接收事件的字符数。
*CommEvent:
传回OnComm事件发生时的数值码
*OnComm
事件:无论是错误或事件发生,都会触发此事件。
(1)
控件参数的初始化。
初始化程序如下:
Mscomm.ComPort=2 `
使用串口Com2
Mscomm.Settings="9600, E, 7, 2" `
波特率9600,偶校验,7位数据位,2位停止位
Mscomm.PortOpen=True `
打开通信端口,准备通信
(2)
计算校验码FCS,计算FCSVB自定义函数如下:
Function FCS(ByVal InputStr As String) As String

Dim Slen, i, Xorresult As Integer

Dim Tempfes As String

Slen=Len(InputStr) `求输入字符串长度

Xorresult = 0

For i = 1 To Slen

Xorresult = Xorresult Xor Asc(Mid$(InputStr, i, 1)) `按位异或

Next i

Tempfes=Hex$(Xorresult) `转化为16进制

If Len(Tempfes)=1Then Tempfes =“0” Tempfes

FCS = Tempfes

End Function

(3) 计算机与PLC通信程序。

主要是一个自定义函数。

Function ReadData(ByVal InputStr As String, ByVal Num As Integer) As String

Dim OutputStr As String

Dim InString As String

Dim ReturnStr As String

Dim EndString As String

Dim FCSString As String

Dim ReturnFCSString As String)

MSComm.InBufferCount=0

OutputStr=InputStr FCS(InputStr) * `给出命令帧

MSComm.Output=OutputStr Chr$(13) `PLC传送命令帧

Do

DoEvents

Loop While MSComm.InBufferCount < 15

InString=MSComm.Input `获取PLC的响应帧

 

`结束码判断

EndString = Mid$(InString, Len(InString) -

Num- 5, 2)

If EndString = "13" Then

ReadData = "Error"

Exit Function

ElseIf EndString = "14" Then

ReadData = "Error"

Exit Function

ElseIf EndString = "15" Then

ReadData = "Error"

Exit Function

ElseIf EndString = "18" Then

ReadData = "Error"

Exit Function

ElseIf EndString = "A3" Then

ReadData = "Error"

Exit Function

ElseIf EndString = "A8" Then

ReadData = "Error"

Exit Function

End If

 

`响应帧校验

EndString = Mid$(InString, 1, Len(InString) - 4)

ReturnFCSString = Mid$(InString,Len(InString) - 3, 2)

FCSString = FCS(EndString)

If FCSString <> ReturnFCSString Then

ReadData = "Error"

Exit Function

End If

 

ReturnStr = Mid$(InString,

Len(InString) - Num - 3, Num)

ReadData = ReturnStr

End Function

从上面程序可以看到,计算机对PLC返回的响应帧要进行FCS校验,并利用异常码排除返回的异常数据,这样不但可以提高计算机获取信息的正确性,而且提高了计算机监控的实时性。

 

FX系列PLC编程线自制方法:
我测试过,避免带电插拔串口!
PC  RS232
           PLC
TXD
3  ----------------------- RX  —1
                                         
GND
5 ------------------------ RX  + 2
                          |
                          |-----TX  + 
7
RXD
2  -----------------------  TX  —  4
7 8
短接
4 6
短接

 

 

 



楼主最近还看过



纵横军团总司令--宝马760LI

  • 精华:0帖
  • 求助:7帖
  • 帖子:146帖 | 4421回
  • 年度积分:0
  • 历史总积分:25033
  • 注册:2005年11月18日
发表于:2012-11-13 20:19:21
1楼

你能否给我弄一个法国彩虹组态软件和台达ah500,或者西门子的通讯啊。


热门招聘
相关主题

官方公众号

智造工程师