VC环境下三菱PLC与微机的串行通信

摘 要:主要介绍三菱FX系列PLC与上位机之间的通讯协议,并采用CSerial类来实现串行通信,本文给出了程序设计方法和部分源代码。

引言

可编程控制器(PLC)是集计算机技术、自动控制技术、通信技术为一体的新型自动控制装置。由于体积小、可靠性高以及组态灵活等优点,PLC在工业控制领域得到了广泛的应用。将PC机与可编程控制器组合起来,充分利用PC机强大的人机接口功能、丰富的应用软件和低廉的价格来共同实现管理、控制一体化成为一个新的发展趋势。本文重点介绍在Windows 2000环境下如何利用VC来实现PC机与三菱PLC之间的串行通讯。

1 三菱PLC与计算机之间通信协议

FX2系列PLC与计算机之间的通信采用RS-232标准,其传输速率固定为9600bps,奇偶校验位采用偶校验。数据格式如表1所示。数据以帧为单位发送和接收。一个多字符帧由图1所示的五部分组成,其中和校验值是将命令码STX——ETX之间的字符的ASCII码(十六进制数)相加,取得所得和的最低二位数。STX和ETX分别表示该字符帧的起始标起和结束标志。

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

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

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

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

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

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

FX2系列与计算机之间的通信是以主机发出的初始命令,PLC对其做出响应的方式进行通信的。共有0、1、7、8四种命令,上位机实现对PLC的读写和强行置位。通过ENQ、ACK和NAK,上位机协调与PLC的通信应答。

2 编程口操作命令类型

串行通信是计算机与其他机器之间进行通信的一种常用方法,在Windows操作系统中提供了实现各种串行通信的API函数。通过SC-09编程电缆或FX-232-BD通讯模块,可以将PC机和计算机串行通信口RS-232连接起来,可以实现PC机对PLC的RAM区数据进行读、写操作。根据PLC本身所具有的特性,计算机可对PLC进行以下4种类型的操作:

(1) 位元件或字元件状态读操作(CMD0);
(2) 位元件或字元件状态写操作(CMD1);
(3) 位元件强制ON操作(CMD7);
(4) 位元件强制OFF操作(CMD8)。

3 软件编程

(1) 串行通信实现方法

在进行以上四种操作之前要对串行通信口进行必要的初始化。本人采用了一个专门针对串行通信的CSerial类,并在Open函数中进行了进一步的完善。它由MuMega Technologies公司提供的一个Visual C++类,我们只要理解CSerial类种的几个成员函数,就能很方便地实现串行通信了。以下是该类定义:
class CSerial
{
public:
CSerial();
~CSerial();
BOOL Open( int nPort , int nBaud,int nParity,int nByteSize,int nStopBits );
BOOL Close( void );
int ReadData( void *, int );
int SendData( const char *, int );
int ReadDataWaiting( void );
BOOL IsOpened( void ){ return( m_bOpened ); }
protected:
BOOL WriteCommByte( unsigned char );
HANDLE m_hIDComDev;
OVERLAPPED m_OverlappedRead, m_OverlappedWrite;
BOOL m_bOpened;
};

① Serial::Open这个成员函数打开通信端口。带五个参数,第一个是串口号,第二个参数是数据传输速率,第三个是数据效验方式,第四个是数据位数,第五个是数据停止位。

② Serial::Close函数关闭通信端口。

③ CSerial::SendData函数把数据从一个缓冲区写到串行端口。第一个参数是缓冲区指针,其中包含要被发送的资料;第二个参数是发送的字节数。

④ CSerial::ReadData函数从断口接收缓冲区读入数据。第一个参数是缓冲区指针,资料将被放入该缓冲区;第二个参数缓冲区的大小。

系统分类:自由话题
用户分类:无分类
标签:无标签
来源:转贴
发表评论 阅读全文(456) | 回复(0)
0
关于投票
PLC高速计数功能的应用
PLC高速计数功能的应用
  
   有朋友关心使用PLC进行高速数据采集(如采集旋转编码器的脉冲信号)的方法,以下以FX系列PLC进行说明。欢迎大家进行更深入地探讨,请介绍您的应用经验。
  1、功能
   FX系列PLC提供了高速脉冲计数功能,通过这一功能可以连接编码器以测量位置,或积算仪表以计算累积量数值。与高速计数功能有关的I/O和软元件有以下:
   1)输入点6点:X0-X5,当该点输入控制高速计数器时,自动响应高速计数处理。此外,X6和X7也是高速输入,但只能用于启动信号而不能用于高速计数。
   2)计数器21点:C235-C255,用于高速输入信号的计数,用法见下文。
   3)辅助继电器21点:M8235-M8255,与21个计数器对应,用于标识该计数器输入信号是增计数还是减计数(见下文)。
  2、计数器的类型
   1)1相无启动/复位端子:C235-C240。
   2)1相有启动/复位端子:C241-C245。
   3)2相双向 :C246-C250。
   4)2相A-B相:C251-C255。
  3、用法
   1)21个高速计数器共享一个PLC上的6个高速计数输入端。如果输入被某计数器占用,它就不能用于其它计数器或其它用途,因此,最多可同时使用21个高速计数器中的6个。
   2)高速计算器的选择并非任意,它取决于输入信号的类型和计数器的类型。信号的类型必须与计数器的类型(见上文第2点)相匹配。
   3)各输入点有多个高速计数器可选择,但不能同时用于多个计数器,即使用了一个计数器后,与该点对应的其它计数器就不可用了。
   4)当M8~~~(M8235-8245)为ON时单相高速计数器C~~~为减计数方式;OFF时为加计数方式;当M8~~~(M846-8255)为ON时单相双输入高速计数器或双相计数器C~~~为减计数方式;OFF时为加计数方式;
  4、高速计数器与输入端的对应关系(见附图)
  
点击看大图


   注:U-增计数输入;D-减计数输入;A-A相输入;B-B相输入;R-复位输入;S-启动输入。
  5、程序例子(二相双向计数器)
   LD X10
   RST C246
   LD X11
   OUT C24
   功能:
   1)X0作为C246的增计数端,X1作为C246的减计数端。即当X0"OFF->ON",C246增一,当X1"OFF->ON",C246减一;
   2)当X11接能时,选通C246,使X0,X1的输入有效。
   3)当X10接通时输入时,C246复位。
  6、计数频率的限制
   1)各输入端的响应速度:X0、X2、X3:10KHZ;X1、X3、X5:7KHZ。
   2)全部高速计数器处理时间:计数器采用中断方式,因此,使用越少,可计数频率越高。若一些计数器用较低的频率,另一些则可用较高频率。使用的全部计数器的频率总和应低于20KHZ。
   3)对2相型计数器:若特定的时刻只使用1相信号,可按1相计算频率总和;若增减计数同时到达计数器,则按2相计算。
   4)对A-B相型计数器:在使用1个或2个这种计数器后,建议不要高于2KHZ频率,计算频率总和时,A-B相型信号的频率应乘以4。例如:C237单相3K+C246双向7K+C255AB相2K,则总和为3+7+2*4=18KHZ。
   5)可计算得:当只使用1个计数器时,频率极限为:1相型-10K;双向型-7K;A-B相型-2K。

系统分类:自由话题
用户分类:无分类
标签:无标签
来源:转贴
发表评论 阅读全文(399) | 回复(0)
0
关于投票
VB串口通讯与开关量的检测与输出
VB串口通讯与开关量的检测与输出
摘要:本文介绍了以VB和计算机串口在一个小型配料工程中的应用为例。详尽的阐述了串口在配料系统中的应用方法。特别在串口通讯中的开关量的检测和输出要点。极大限度的降低了系统硬件所占工程中的成本。
引言:在一般的配料工程中,要一台上位机对配料过程中所产生的一系列数据进行保存和统计,往往需要检测来自现场的一些开关信号。在应用工程中,在一般的上位机与称量仪表的通讯过程中,一般只用了3个引脚(TXD ,RXD ,GND),而还有6个脚(CD,DSR,CTS,RI,DTR,RTS)没有用到,而这些没有用到的引脚就正好可用于检测和输出开关量。
下面我将介绍基于VB6.0的平台做的一个小项目。
工程概况:该项目是广州科密集团公司用于一种新型耗材的配方研制所用的一个的自动配方管理软件。由于实验场所环境所限制,要求计算机不放在现场(不要求设立专人去操作计算机),只要求操作工人每称量按一下秤台旁边的一个按钮就可以存储当前每物料种类和其相应的重量,使管理系统以这个实验数据为依据,进行整理和加工。最后得出一些综合分析结果,为以后的正式生产提出配方工艺上的要求。因此系统本身就要求负责实时采集仪表的数据;实时采集开关量(按钮和转换开关的状态);实时的提醒操作员当些次配料是否有效果(根据配方来看是否报警也就是开关量的输出);还有存储当前当种物料的配料量,配方的管理,用户日后的数据查询和分析工作等。
根据这种要求,我们可以选择一种RAD工具来作为开发平台。
  


硬件配置:两套计量设备(包含两台定点输出仪表)一台计算机(工控机)
软件:本实例采用Microsoft公司的Visual Basic 6.0作为开发平台。Visual Basic是一种具有可视图形界面的、快速开发工具,同时它也较流行的开发工具。它可以利用Mscomm控件来完成对串口的控制和开关量的采用以及开关量的输出。

先介绍一下这九个引脚所代表的意义:
RXD表示接收数据
TXD表示发送数据
GND表示接地
注:(连接计算机和通讯仪表的接地端,开关量的输入的公共端就用仪表的电源)
CD表示调制解调器通知通计算机有载波被检测到 
DTR表示计算机通知调制解调器可以进行传输
DSR表示调制解调器通知计算机准备就序
RI表示调制解调器通知计算机有电话打来
CTS表示调制解调器通知计算机可送出数据
RTS表示计算机要求调制解调器将数据发出
根据这些引脚的意义,我们将调制解调器当成其它的外部设备, CD、DSR、RTS、RI可以用于开关量的输入引脚。RTS和DTR可用于开关量的输出。
具体方法如下:
   在工程中,添加部件Microsoft Comm Control 6.0控件。

1. 控件属性设置介绍:
 Commport:设置或返回端口号。就是指 通讯的端口号, 用COMM1就设为1, 用COMM2就设为2, 但MSComm控件的最大值是16, 在本项目中同 时用了两个口, 因为需要和两台仪表进行通讯(常用计算机有两个串口, 如果串口不 够用的话, 可以买串口卡)。
 Settings:设置并返回波特率、奇偶校验、数据位、停止位 。参数格式为:"BBBB,P,D,S"。例如“9600, E, 7, 2”;在RS232中双方必须完全一样, 彼此才能顺利的通信。否则的话将不 能正确的接收到来自对方的信号。
 Handshaking:设置并返回硬件握手协议;(设为无)
 InBufferSize:设置并返回接收缓冲区的字节数;
 OutBufferCount:返回在传输缓冲区中等待的字符数。也可以用它来清除传输缓冲区;
 DTREnable:确定在通讯时是否使 Data Terminal Ready (DTR) 线有效(设为有效)。
 RTSEnable:确定在通讯时是否使 Request To Send (RTS) 线有效(设为有效)。
 CommEvent:返回最近的通讯事件或错误。当发生错误或事件会产生OnComm事件。
 InputMode:设置或返回Input 属性取回的数据的类型。它有两个参数, 0 表示以文字形式取回, 1表示以二进制形式取回。(设为0)
 Rthreshold:设置并返回的要接收的字符数。
 Sthreshold:设置并返回传输缓冲区中允许的最小字符数
 InputLen:设置并返回 Input 属性从接收缓冲区读取的字符数。
系统分类:自由话题
用户分类:无分类
标签:无标签
来源:转贴
发表评论 阅读全文(592) | 回复(0)
0
关于投票
PLC与PC机通讯的VB源程序
PLC与PC机通讯的VB源程序
 PLC与PC机通讯的VB源程序大体如下:如下程序采用的是FX232BD通讯模块,协议就是FX通讯协议。
‘强制PLC为RUN
Private Sub command1_Click()
   Dim dat As String
   commli.OutBufferCount = 0
    commli.InBufferCount = 0
           dat = "01FFRR0"
    commli.Output = Chr$(5) + dat + SumChk(dat)
    
End Sub
‘强制PLC为STOP
Private Sub command2_Click()
   Dim dat As String
   commli.OutBufferCount = 0
   commli.InBufferCount = 0
   dat = "01FFRS0"
   commli.Output = Chr$(5) + dat + SumChk(dat)
    
End Sub
‘强制Y0为1
Private Sub command3_Click()
   Dim dat As String
   commli.OutBufferCount = 0
   commli.InBufferCount = 0
   commli.Output = “01FFBW0Y001011”
    
End Sub
‘强制Y0为0
Private Sub command3_Click()
   Dim dat As String
   commli.OutBufferCount = 0
   commli.InBufferCount = 0
   commli.Output = “01FFBW0Y001010”
    
End Sub


'设置电脑通信参数
Private Sub Commlis()
   
    If commli.PortOpen = True Then
        commli.PortOpen = False
    End If
    If Not commli.PortOpen Then
        commli.CommPort = 1 '通信口
        commli.Settings = "9600,N,8,1"
        commli.Handshaking = 0
        commli.InputLen = 0
        commli.OutBufferCount = 0
        commli.InBufferCount = 0
        commli.PortOpen = True
    End If
    Exit Sub

    
End Sub
Private Function SumChk(Dats$) As String
    Dim i&
    Dim CHK&
    For i = 1 To Len(Dats)
        CHK = CHK + Asc(Mid(Dats, i, 1))
    Next i
  
    SumChk = Right(Hex$(CHK), 2)
End Function
Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐