研华工控机与西门子S7-200型号PLC通讯设计(示范例程)

作者:工业平板电脑|手持终端解决方案提供商    来源:www.wxtkj.cn    发布时间:2016-03-28 16:51    浏览量:

        近,几个客户一直在咨询西门子S7-200型号PLC与工控机通讯的问题,南京研维信息技术解决方案部门针对这方面需求,特意以专题形式予以解答,本文就以研华工控机为典型工控机类型进行介绍,下位机PLC选择大家比较常见的西门子S7-200型号产品,我们选择的是微软的Visual C++作为程序开发语言,具体通讯协议架构如下:
       首先,整个示范程序的基本流程架构思路如下:用上位机作主机,向PLC发送读/写指令,PLC接收到信息后判断传输正确与否,若错误则反馈BCC码错误信息给上位机,若为读指令,在本系统中则读取实时压力值,若为写指令,则向PLC的M寄存器区写入数据,从而控制现场设备的运行。同时上位机向PLC询问写入数据库标志位状态,若为1则将压力值写入后台数据库。系统中计算机通过COM口发送指令到PLC的PORTO(或PORT1)口,PLC通过RCV接收指令,然后对指令进行译码,译码后调用相应的读/写子程序实现指令要求的操作,并返回指令执行的状态信息。
        然后,我们对上位机进行软件设计,主要开展通讯接口协议定制开发,主要包括两方面内容:
        一是监控界面要实时反应现场压力变化,因此需要不断从PLC中读取压力值,二是工控机监控界面的软键盘上的一些控制按钮需要能完成硬控制面板上所能操作的所有功能,这两个通讯过程中途都不能被打断,否则通讯会出错,因此上位机采用多线程下来实现串行通信。多线程的实现可以使得各端口独立,准确地实现串行通信,使串口通信具有更广泛的灵活性与严格性,且充分利用了CPU时间。本系统将读取实时压力值这一通讯过程放在一个独立的线程中,采用Sleep()函数,让上位机在读取一次压力值后休眠一段时间再进行下一次读取,这样读取压力值的过程就可以在后台进行操作了。
        通信程序用CreatFile打开串口,并用SetCommState设置串口值,用ReadFile()和WriteFile()来接收和发送数据,为了实现线程的同步,采用临界区CriticalSection来实现,保证在同一时刻只能有一个线程对同一内存区进行操作,这样能够防止两个线程同时自主访问同一内存区所造成的访问结果的不确定性。采用事件驱动的方式来查询串口是否有数据到达,当然在进行串行数据传输之前,两个设备必须达成握手协议,只有两者协议成功以后,才可以进行数据传输。


        上位机串口设置程序如下:
BOOL MultiDoc::ConfigConnection()
{DCB dcb;
if(!GetCommState(m_hCom,&dcb))
return FALSE;//不能获取当前配置作错误处理
dcb.fBinary=TRUE;
dcb.BaudRate=9600;//数据传输速率
dcb.ByteSize=8;//每字节的位数为8
dcb.fParity=FAISE;//不启用奇偶校验
dcb.StopBits=ONESTOPBIT;//1个停止位
return SetCommState(m_hCom,&dcb);
//设置串行设备控制参数}
        第三步,我们要开展下位机程序设计,由于S7-200 CPU通讯端口是RS485半双工通讯口,因此发送和接收指令不能同时处于激活状态。CPU使用SMB30(Port0)和SMB130(Port1)定义通信口的工作模式,用XMT/RCV指令向指定通讯口以字节为单位发送/接收一串数据字符,要发送的字符以数据缓冲区指定,一次发送的字符多为255个,指令执行完成后,会产生一个中断事件(发送指令Port0为中断事件9,Port1为中断事件26,接收指令Port0为中断事件23,Port1为中断事件24)。
        PLC在次扫描时执行初始化子程序,对端口及RCV指令进行初始化。初始化完成后,运行RCV指令使端口处于接受状态,接收完后用启用中断,中断程序对指令进行译码,同时给校验子程序入口寄存器置位,发送接收标志位复位,并将写入接收数据地址指针。计算接收数据的BCC码,若正确且结束字符为设定值时则给BCC码正确标志位置位,若标志位为写,则调用write子程序,向PLC寄存器中写入控制值,进而控制现场的设备运行,若为读,则调用read子程序,则从PLC的数据缓冲器中读取压力值,如果BCC码不正确,则直接向上位机发送BCC校验码错误的信息,如BCC码正确而结束字符不等于设定值,则向上位机发送指令不合法的信息。
       PLC初始化子程序代码如下:
LD SM0.0
MOVB 16#09,SMB30//初始化自由端口,选择波特率为9600
MOVB 16#EC,SMB87//允许接收,检测信息始末字符
MOVB 103,SMB88//信息开始字符“G”
MOVB 71,SMB89//信息开始字符“g”
MOVW +1000,SMW92//信息超时值1s
MOVB 55,SMB94//大接收字符数55
ATCH RCVcomplete,23//接收完成中断连接到RCV complete子程序
ATCH XMTcomplete,9//发送完成中断连接到XMT complete子程序
ENI //允许全局中断
MOVB 2,VB221//设定本PLC地址
MOVD &VB102,VD169//装载接收缓冲器地址指针
MOVB 0,VB215//清零接收数据BCC码
MOVD &VB176,VD217/装载发送缓冲器地址指针
MOVB 0,VB216//清空发送数据BCC码

        值得说明的,我们在进行上位机、下位机设计时,首先需要定义的就是我们的通讯协议设计,我们本程序约定串行通信的波特率为9600b/s,每字节为8位,不采用奇偶校验位,采用异或校验法进行检验,指令采用ASCII码进行传送,计算机每次发送一个38字节长的指令来实现一次读/写操作,命令帧(上位机)格式为:字节0为起始字符,标志为指令的开始,本例设定为ASCII码的“G”,字节1为指令类型,05H代表读操作,06H代表写操作,字节2~3为目标PLC站地址,字节4~19为目标寄存器地址,在PLC内部可以用4个字节来表示一个寄存器的地址(但不能表示一个位地址)。前两个字节表示寄存器类型,后两个字节表示寄存器号,0000(H)为I寄存器区、0100(H)为Q寄存器区、0200(H)为M寄存器区、0800(H)为V寄存器区(本系统中主要是对M寄存器区写入控制字,从V寄存器区中读取数据,同时因为系统工作时为四个工件同时检测,上位机读取PLC数据时为同时读取四个压力值,故在此使用了16个字节)。字节20~21为读写字节数,字节22~35是要写入的数据,字节36~37为发送BCC校验码,字节38为结束字符,本例中为ASCII码的“g”,其中字节2~37均为十六进制ASCII码格式。

企业分站 在线客服 :     服务热线: 025-86136252 / 15062244194     电子邮箱: [email protected]

公司地址:江苏省南京市江宁区未来科技城

研维信息是一家集研发、生产、销售为一体的工控机、嵌入式安装工业平板电脑、加固手持平板电脑、加固类三防计算机的专业设备提供商,提供各种尺寸和规格的安装式工业平板电脑,手持三防平板电脑,加固三防计算机。核心研发及市场团队均有10余年的相关行业背景,尤其是公司的ODM团队,可以为客户提供快速、质优、灵活的客户定制化产品OEM及ODM服务,公司对员工及客户,都一直秉承合作共赢、以德为先的经营宗旨,为客户提供优质产品及服务,提升客户价值。

关注研维微信公众号,掌握工控行业最新动态资讯
备案号:苏ICP备14059761号-8
主营区域:北京江苏浙江上海安徽山东四川广东福建天津河北河南湖南湖北陕西、山西、辽宁吉林江西黑龙江重庆内蒙古广西海南贵州云南新疆甘肃宁夏青海西安成都深圳杭州苏州广州武汉青岛东莞珠海宁波郑州
声明:(1)本站遵循《中华人民共和国广告法》,在标题、页面等文案描述中尽量规避违禁词、极限词,如还有违禁词、极限词,在此申明上述词汇表述全部失效,如客户咨询均表示默认此条款,不支持任何形式以违禁词、极限词等理由投诉或要求收取费用私下解决,特此申明!(2)除非研维公司另行申明,本网站内的所有产品、技术、软件、程序、数据及其他信息(包括文字、图标、图片、照片、音频、视频、图标、色彩组合、版面设计等)的所有权利(包括版权、商标权、专利权、商业秘密及其他相关权利)均归研维公司所有。未经研维公司的许可,任何人不得以包括通过机器人、人力等程序或设备监视、复制、传播、展示、镜像、上载、下载等方式擅自使用本网站的任何内容。一旦发现侵权行为,我司将立即进行证据保全并诉诸法律。
在线客服