用VC实现微机与PLC在以太网中的通讯Word格式.docx
《用VC实现微机与PLC在以太网中的通讯Word格式.docx》由会员分享,可在线阅读,更多相关《用VC实现微机与PLC在以太网中的通讯Word格式.docx(6页珍藏版)》请在冰豆网上搜索。
CaoWeiSHIWang-wangCHENHong
(InformationEngineeringCollegeofYangzhouUniversity,Yangzhou225009,China)
Abstract:
AkindofcommunicationprogramdevelopedwithVCisintroduced,whichissuccessfullyappliedintheautomaticcontrolsystem,andmainlycarryoutthecommunicationbetweenhostandOMRONPLC.Thecommunicationprotocolbetweenthemisdealtwithindetail.Thedesignmethodof
图1FINS协议和TCP/IP协议之间的关系
FINS帧本质上属于链路层,为了能利用TCP/IP协议传输FINS帧,将FINS信息作为UDP的数据区,封装在UDP中,从TCP/IP协议的角度看FINS信息,属于应用层数据。
如果在PLC上安装以太网单元和Link通讯单元,就可以实现以太网和Link网之间的数据转发过程如图2所示。
图2利用FINS中继的过程
图中,上位机发出带有FINS信息的以太网帧被中继PLC的以太网单元接收后,层层分解,直到抽取出FINS信息后,通过Link通讯模块转发FINS信息,目的PLC收到数据后作出响应,响应数据也采用FINS格式的数据,中继PLC收到数据后,转发给以太网单元,由以太网单元进行封装后与上位机通讯,上位机也作为以太网网段中的一个节点,也有相应的节点号和相同的地址转换规则。
2.2FINS帧格式
在PLC之间采用FINS协议中的SEND、RECV或CMND命令进行数据通讯时,上述封装和分解过程在通讯模块内部自动实现,但对于上位机和以太网单元之间的通讯,FINS的报头和命令应由上位机程序添加,而UDP的报头由Socket自动完成。
FINS报头的格式见图3。
图3FINS报头格式
ICF为信息控制域,主要用于标明命令和响应,RSV为系统保留,GCT为网关允许数目,DNA为目的网络号,DA1为目的节点号,DA2为目的节点单元,用于标明CPU还是CPU总线单元,SNA为源网络号,SA1为源网络节点号,对应上位机IP地址的主机部分,SA2为源节点单元,对上位机而言应为00,SID为服务和响应的标识,可任意设置,命令和响应有相同的数值,MRC和SRC为FINS命令的主命令和从命令,Data域为数据区,用于标明读数据时的地址范围或写数据时的地址和数据。
2.3以太网单元的设置
通讯测试前必须首先登记I/O表,可以用CX-Programmer软件在编程模式下自动登记I/O表,还要设置IP地址、子网掩码、设置CPU总线单元、地址转换方法、FINS的UDP端口号,FINSUDP端口号缺省为9600。
以太网单元属于CPU总线单元,单元号旋转开关设定一个十六进制数,作为以太网单元的单元号,范围为00~15,它决定了分配给以太网单元相应的内存工作区(CIO区、DM区)。
节点号通过两个旋转开关设定两位十六制数,作为以太网单元在网络中的节点号,范围为01~126。
以太网单元进行通信前,必须使用编程设备如CX-P对以太网单元进行设置。
内存工作区分配CIO区和DM区中的字按照单元号分配给每个单元,每个单元在CIO区中分配25个字,在DM区分配100个字。
如果设为0号单元则分配CIO1500~CIO1524共25个字,D30000~D30099共100个字。
跨网通讯时,必须对每一个节点建立路径表,路径表包括本地网络表和中继网络表。
本地网络表提供了安装在PLC单元上的通讯单元的单元号和网络号,中继网络表包括终点网络、中继网络和中继节点三项内容,用于FINS通讯时的数据转发。
三、上位机通讯程序设计
为实现上位机的TCP/IP通讯,采用Socket编程。
考虑到实现的效率,采用了较低层次的异步WinSock即MFC中的CAsyncSocket类实现。
在编程时首先从CAsyncSocket类派生出CUDPSocket类,在程序初始化时创建CUDPSocket类的实例。
BOOLCOMRONTestDlg:
:
OnInitDialog()
{
CDialog:
OnInitDialog();
psock1=newCUDPSocket;
psock1->
Create(PC_PORT,K_DGRAM);
…
}
当用户发出读取PLC数据的命令时,相应的消息处理函数作出响应,读取命令参数,将ASCII命令转换成二进制数据,进行FINS报头的封装,调用CUDPSocket的发送函数进行命令的发送,要程序为:
m_sendData.MakeUpper();
//将命令字符转换成大写字母;
AsciitoB((LPCSTR)m_sendData,bcommand,m_sendData.GetLength());
//ASCII转换二进制
SendTo(bcommand,m_sendData.GetLength()/2,
m_PortNoPLC,m_IPAddressPLC);
//调用Socket发送
对于接收程序,在CUDPSocket中建立接收消息响应函数,当有数据到来时,该函数作出响应,主要任务为读取缓冲区数据,将二进制数据转换ASCII字符,用于界面显示,同时进行数据定位和数据的处理,要程序如下:
voidCUDPSocket:
OnReceive(intnErrorCode)
COMRONTestDlg*pDlg=(COMRONTestDlg*):
AfxGetMainWnd();
//获取主窗口指针
charpbin[4096];
//分配缓冲区
intnLenhth=pDlg->
psock1->
Receive(pDlg->
pRevBuf,4096);
//读取缓冲区数据
pDlg->
BtoAscii(pDlg->
pRevBuf,pbin,nLenhth);
//二进制转ASCII码
m_RecvEdit.SetWindowText(pbin);
//显示数据
……//其它数据处理
CAsyncSocket:
OnReceive(nErrorCode);
四、结束语
运用VC++异步套接字类CAsyncSocket与OMRONPLC进行以太网通讯,由于以太网单元采用广泛使用的TCP/IP协议,上位机程序设计简单,除了进行FINS报头拼装,其它过程与微机之间的TCP/IP程序设计完全一致,用VC设计的程序具有实时性好、速度快、可靠性高、运行稳定等优点,此方法已成功应用工程项目中。
控制系统中采用以太网单元通讯后,使工业自动化与生产管理自动化有机地结合到了一起,简化了系统设计。
参考文献:
[1]李炳宇,萧蕴诗.以太网在网络控制系统中的应用与发展趋势[J].微型机与应用,2002.11
[2]CJ1W-ETN11(10BaseT)EthernetUnitsOperationManual[M].2001.5
[3]宫叔贞,王冬青.可编程控制器原理及应用[M].人民邮电出版社,2002.7