基于VC5.0的PC与松下PLC的通讯及其应用

来源:周奉磊

点击:87

A+ A-

所属频道:新闻中心

关键词:PLC 串行通讯

    1 引言

        随着PLC应用范围的不断扩大,PLC与PC之间通讯技术的应用需求越来越广泛。通过PLC的编程口进行通讯不仅可以减少系统的本钱及复杂性,同时可以减少PLC方面软件的复杂程度和编程量。本文根据实际工程中的经验进行总结,介绍了利用VC++中MFC实现PC与松下FP0系列PLC编程口进行串行通讯的程序设计基本方法。

    2 PC与FP0 PLC之间的通讯协议和接口

        在一个规模较大的纺织产业控制系统中,经常有几十个、几百个甚至更多的测温顺控制对象。即使速度很高的系统,也很难满足要求。为了降低危险,进步可靠性,必须将任务分散,而分散的设备需要通过一定的手段连接起来,其中数据通讯和系统互连是该系统的关键技术之一。松下FP0系列PLC具有较强的通讯功能,可以适合各种产业自动化网络的不同需要, 其中包括以太网协议及通用接口、H型链接通讯系统(H-LINK)、P型链接系统(OPTICAL LINK)、W型链接系统(WIRE-LINK)和C-NET链接系统,还有远程I/O通讯系统(REMOTE I/O),它们通过RS-485、RS-232或专用网络插座在PLC-PLC、计算机与PLC之间进行通讯。但是要利用这些系统协议,必须采用专用高级通讯单元,这势必增加系统的本钱。为了节省开支,纺织产业系统可以直接采用松下电工最基础的专用通讯协议-NEWTOCOL。

        NEWTOCOL分为两部分:一是NEWTOCOL-COM,即关于计算机通讯的协议;二是NEWTOCOL-DATA,即关于数据传输协议。

        2.1  NEWTOCOL-COM的帧格式

        (1) 命令发送帧

        (2) 正确响应帧
        img]周奉磊-b2.jpg border=0>

        (3) 错误响应帧
        img]周奉磊-b3.jpg border=0>

        2.2  NEWTOCOL-DATA的帧格式

        (1) 命令发送帧
        img]周奉磊-b4.jpg border=0>

        (2) 正确响应帧
        img]周奉磊-b5.jpg border=0>

        (3) 错误响应帧
        img]周奉磊-b6.jpg border=0>

        通过该协议可更加快捷地传送系统所需的数据,设置PLC所需的参数。FP0 PLC与上位机链接通讯协议如图1所示:

    图1 FP0 PLC 与上位机链接通讯协议

    3 通讯程序设计

        在PC机和松下FP0系列PLC进行串行通讯时,由于PC与PLC之间的信息传送是通过PLC编程口实现的,采用的是FP0 PLC专用协议通讯指令。因此,在PC编程方面需要严格的遵循PLC编程口通讯协议。具体实现介绍如下:

        3.1 串口设备的打开

        在Visual C++中,利用MFC CFile类来实现串行通讯。这种通讯方式与访问磁盘普通文件没有太大不同。打开串口设备需作以下操纵:

        CFile file;
        CFileException e
        File.open(
        portName,      // example "com1",com2"
        CFile::modeReadWrite,
        &e);

        3.2 串口设备的初始化

        串行端口创建时,必须对其进行设置以匹配与其对话的设备。FP0系列PLC的波特率为固定的9600bps,奇偶校验采用奇校验,1位停止位,8位数据位。一般地,可用如下程序设置它们:

        DCB dcb;
        ::GetCommState((HANDLE)file.m_hFile,&dcb);
        dcb.BaudRate=9600;
        dcb.StopBits=1;
        dcb.ByteSize=8;
        dcb.Parity=1;
        ::setCommState((HANDLE)file.m_hFile,&dcb);

        为了更好的控制端口可以利用SetCommTimeouts()函数打开或封闭串口超时功能,具体程序如下:

        COMMTIMEOUTS cto;
        ::GetCommTimeouts((HANDLE)file.m_hFile,&ct0);
        cto.ReadIntervalTimeout=0;
        cto.ReadTotalTimeoutMultiplier=0;
        cto.ReadTotalTimeoutConstant=0;
        cto.WriteTotalTimeoutMultiplier=0;
        cto.WriteTotalTimeoutConstant=0;
        ::SetCommTimeouts((HANDLE)file.m_hFile,&cto);

        3.3 PC与FP0 PLC之间的通讯实现

        在FX2系列PLC与PC机的通讯中,数据是以帧为单位发送和接收的。其中字符ENQ(0x05)、ACK(0x06)、和NAK(0x15)作为单个字符,可以构成单字符帧。若通讯正常,则应答字符$;若通讯有错,则应答字符!。其余的字符在发送和接收时必须用字符%和CR分别表示该字符帧的起始标志和结束标志,否则将构成帧错。一个多字符帧由%、地址码、站号、数据、和校验以及CR五部分组成,其中和校验值是其初值为0,然后从起始符开始与该帧报文中每一字节按位进行异或运算得到。

        (1) 应用MFC CFile类实现对串口设备的读、写操纵的代码

        //读串口
        char m_Readbuff[UINT n];
        uint nByte=file.read(
        &m_ReadBuff,      //缓存储冲
        UINT nCount //所读字节数
        //写串口
        char m_WriteBuff[UINT n];
        file.Write(
        &m_WriteBuff,     //存储缓冲
        UINT nCount      //缩写字节数
        );

        (2) PC机实现与PLC通讯的程序代码

        char m_WriteBuff[10];
        char m_ReadBuff[10];
         UINT nByte=0;
          m_WriteBuff[0]=0x05    //ENQ
        //写串口
        file.Write(
        m_WriteBuff,     //存储缓冲
            //所读字节数
        );
        //读串口
        nByte=file.Read(
        m_ReadBuff,     //存储缓冲
        //所写字节数
        );
        switch (m_ReadBuff[0])
          {
        case : 0x24    //应答$,通讯正常
          //添加相关处理代码
        break;
        case : 0x21 
          //应答!,通讯故障
          //添加相关处理代码
         break;
          }

        3.4 PC对PLC内各软设备进行读、写操纵

        FP0系列PLC的所有开关量输进、输出以及各软设备对PC机都是透明的,只有当PLC的计时器和计数器的设定值采用常数时,以及文件寄存器内的数据,PC机不能对其进行读写。不论PLC处在“STOP”状态还是“RUN”状态,PC机都可以按1.1所列的命令对PLC进行读、写操纵。这里仅给出PC机与PLC通讯所用多字符帧的格式及简单示例,实际应用时只需将多字符帧中的字符ASCII码(十六进制)按顺序赋予相应的字符数组m_WriteBuff,m_ReadBuff,即可实现对PLC的操纵。

        (1) 读操纵
        img]周奉磊-b7.jpg border=0>

       
        (2) 写操纵

        微机对PLC软设备进行写操纵的多字符帧的编制格式如下表所示: img]周奉磊-b8.jpg border=0>

       
        PLC接收到写操纵多字符帧格式后,若接收到数占有效,则应答$(0x24),该字符帧如下表所示: img]周奉磊-b9.jpg border=0>

       
        若接收数据无效或和校验出错,则应答字符!(0X21),该字符帧如下表所示: img]周奉磊-b10.jpg border=0>
       
        3.5  封闭串口设备

        PC机与PLC通讯完毕后,PC机封闭一个已打开的串口设备只需如下一条语句即可完成。

        File.Close();

    4 应用实例

        以上介绍了利用MFC实现PC与FX2系列PLC串行通讯的基本方法及其关键部分程序代码。上面的程序代码为基础,不仅可以编制用于以PLC为现场主控机的监控系统软件,而且可编制出微机与其他具有串行通讯能力设备的串行通讯程序。本人已成功使用VC5.0实现PLC与上位机之间的通讯,并应用于青岛大学纺织服装学院开发的掉毛量测试仪。该测试仪控制系统采用PLC 控制步进电机方案,有效地进步了工作效率,使操纵职员通过PC的显示可以监测并控制仪器的工作。兔毛织物掉毛量测试仪已可靠运行一年,实践证实它具有控制灵活、使用简单、功能扩充方便、抗干扰性能强的特点。没有出现任何通讯连接的题目。

    (审核编辑: 沧海一土)

    声明:除特别说明之外,新闻内容及图片均来自网络及各大主流媒体。版权归原作者所有。如认为内容侵权,请联系我们删除。