VC怎样用socket 编程发送浮点数?因为要和下位机编程PLC进行通信。

用VC实现微机与PLC在以太网中的通讯*
(扬州大学信息工程学院电气工程系,扬州 225009)
摘要:介绍了一个使用Visual C++的Socket与OMRON PLC之间的通讯程序,并成功地应用在自动控制系统中,主要实现上位机与OMRON PLC之间的以太网通讯,并对它们之间的通讯协议作了描述,文中所介绍的通讯程序的设计方法具有一定参考价值。 关键词:可编程逻辑控制器,以太网,FINS,控制系统。
Kind of Communication Program Between Host and OMRON PLC With VC in Ethernet
SHI Wang-wang
(Information Engineering College of Yangzhou University, Yangzhou 225009,China) Abstract: A kind of communication program developed with VC is introduced, which is successfully applied in the automatic control system, and mainly carry out the communication between host and OMRON PLC.
The communication protocol between them is dealt with in detail. The design method of communication program has some reference value.
Keywords: PLC
control system
在分布式计算机监控系统中,PLC是常用的现场控制设备,PLC和微机之间的通讯常采用RS-232/RS-485串行通讯方式,这种方法对于数据量较大、通讯距离较远、实时性要求高的控制系统很难满足通讯需要。工业以太网特别是交换式以太网已经广泛用于工业控制中,是工业控制中的发展趋势[1]。许多大型PLC厂商生产的PLC都配备了相应的以太网通讯单元,本文讨论OMRON PLC的以太网通讯体系结构,并以CJ1G型PLC的以太网模块ENT11为例实现与微机的通讯,上位机利用Visual C++的CAsynSocket类的UDP协议实现了微机和PLC以太网模块之间的FINS通讯,程序实现简单,并给出了核心程序。
2、PLC的网络体系结构与FINS协议
2.1 FINS协议与TCP/IP协议
OMRON公司的ETN11型以太网单元支持10Base-T型以太网,网络层和传输层采用TCP/IP和UDP/IP协议,应用层协议支持FTP、SMTP和FINS(Factory Interface Network Service),FINS通讯协议是OMRON开发的用于工厂自动化控制网络的指令/响应系统,使用FINS指令,且可实现网络间的无缝通信。网络对于每个系统层次都是有效的,用于信息 层的Ethernet,用于控制器层的Controller Link网络和用于器件层的DeviceNet(CompoBus/D),
而且在Ethernet和Controller Link网络之间的通信,能够在三个网络层次间进行,像一个网络一样方便。使用FINS指令,上位机程序或PLC用户程序通过指令就能够读取另一个PLC数据区的数据,简化了用户程序。
以太网通讯使用IP地址,而FINS通讯使用节点号,节点号为以太网和Link网之间提供了一致的寻址方式,以太网单元能在IP地址和节点号之间转换,转换方式有自动转换、IP地址表和复合地址表[2]。FINS通讯与TCP/IP协议之间的关系见图1。
图1 FINS协议和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.2 FINS帧格式
在PLC之间采用FINS协议中的SEND、RECV或CMND命令进行数据通讯时,上述封装和分解过程在通讯模块内部自动实现,但对于上位机和以太网单元之间的通讯,FINS的报头和命令应由上位机程序添加,而UDP的报头由Socket自动完成。FINS报头的格式见图3。
FINS报头格式
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端口号,FINS UDP端口号缺省为9600。以太网单元属于CPU总线单元,单元号旋转开关设定一个十六进制数,作为以太网单元的单元号,范围为00~15,它决定了分配给以太网单元相应的内存工作区(CIO区、DM区)。节点号通过两个旋转开关设定两位十六制数,作为以太网单元在网络中的节点号,范围为01~126。以太网单元进行通信前,必须使用编程设备如CX-P对以太网单元进行设置。内存工作区分配CIO区和DM区中的字按照单元号分配给每个单元,每个单元在CIO区中分配25个字,在DM区分配100个字。如果设为0号单元则分配CIO1500~CIO1524共25个字,D30000~D3个字。
跨网通讯时,必须对每一个节点建立路径表,路径表包括本地网络表和中继网络表。本地网络表提供了安装在PLC单元上的通讯单元的单元号和网络号,中继网络表包括终点网络、中继网络和中继节点三项内容,用于FINS通讯时的数据转发。
三、上位机通讯程序设计
为实现上位机的TCP/IP通讯,采用Socket编程。考虑到实现的效率,采用了较低层次的异步WinSock即MFC中的CAsyncSocket类实现。在编程时首先从CAsyncSocket类派生出CUDPSocket类,在程序初始化时创建CUDPSocket类的实例。
BOOL COMRONTestDlg::OnInitDialog()
CDialog::OnInitDialog(); psock1=new CUDPS psock1-&Create(PC_PORT,K_DGRAM);
当用户发出读取PLC数据的命令时,相应的消息处理函数作出响应,读取命令参数,将ASCII命令转换成二进制数据,进行FINS报头的封装,调用CUDPSocket的发送函数进行命令的发送,要程序为:
m_sendData.MakeUpper();
//将命令字符转换成大写字母;
AsciitoB((LPCSTR)m_sendData,bcommand,m_sendData.GetLength()); //ASCII转换二进制 psock1-&SendTo(bcommand,m_sendData.GetLength()/2,
m_PortNoPLC,m_IPAddressPLC); //调用Socket发送
对于接收程序,在CUDPSocket中建立接收消息响应函数,当有数据到来时,该函数作出响应,主要任务为读取缓冲区数据,将二进制数据转换ASCII字符,用于界面显示,同时进行数据定位和数据的处理,要程序如下:
void CUDPSocket::OnReceive(int nErrorCode)
COMRONTestDlg* pDlg=(COMRONTestDlg*)::AfxGetMainWnd();
//获取主窗口指针 char pbin[4096];
//分配缓冲区 int nLenhth=pDlg-&psock1-&Receive(pDlg-&pRevBuf,4096);
//读取缓冲区数据 pDlg-&BtoAscii(pDlg-&pRevBuf,pbin,nLenhth);
//二进制转ASCII码 pDlg-&m_RecvEdit.SetWindowText(pbin);
//显示数据
//其它数据处理
四、结束语
运用VC++异步套接字类CAsyncSocket与OMRON PLC进行以太网通讯,由于以太网单元采用广泛使用的TCP/IP协议,上位机程序设计简单,除了进行FINS报头拼装,其它过程与微机之间的TCP/IP程序设计完全一致,用VC设计的程序具有实时性好、速度快、可靠性高、运行稳定等优点,此方法已成功应用工程项目中。控制系统中采用以太网单元通CAsyncSocket::OnReceive(nErrorCode);视&&&&&&频:
图&&书&馆:
每天一句正能量:
懒惰的你将一无所有!
socket编程
上传: by zcy1989xy
To view this page ensure that Adobe Flash Player version
10.0.0 or greater is installed.
Either scripts and active content are not permitted to run or Adobe Flash Player version
10.0.0 or greater is not installed.
资料类型:pdf
资料分类:技术文档
发布时间: 0:05:09所需积分:3分
socket编程基础
你可能感兴趣的资料还有:
表情 &&评论最长字数:1000
相关文档资料哎,又来提问了,还是关于ClientSocket,惭愧ClientSocket与PLC通信,发送指令后PLC会返回不同寄存器的值。比如我现在用两个定时器不断发送指令(分别读取两个寄存器的值),而PLC每 接收到我发的指令 就会返回当时寄存器的值,格式完全相同,只是内容不同(从内容上看不出来自于哪个寄存器)我在OnRead事件用ReveiceBuf函数读取,问题就是我怎么区分收到的数据 是哪个寄存器的值呢?说一下我想到的思路:1、用多个ClientSocket组件,相当于多个客户端,但是这个很麻烦,绝对不是最好的方法2、用IdTCPClient组件,采用阻塞模式,这样就不存在区分的问题了,但是有隐患。如果我需要多个数据同时发送,等待时间
会不会有点长。而且需要一个数据发送不成功,并不影响别的数据的发送(多个定时器发送不同的数据内容)3、多线程。。。没用过。。。不知道该怎么处理其实问题很简单,就是通过一个端口读取不同寄存器的值,我需要对不同的寄存器做不同的处理,但是我区分不出来数据来自于哪个寄存器
回答1:就是你的思路吧建议使用1 建立与寄存器对应的连接 其实不麻烦 每个寄存器查询都有单独的连接
回答2:这个不可能不知道的自己做个匹配就可以了或者我这么说吧,如果有多个客户端,每个client都给server发数据,server返回给各个client你说server是怎么返回的呢?比如我有A B C 3个client 都连上了server server再接收到数据的时候分别返回a b c给A B C那这个server怎么知道该怎么去对应?Socket-&Handle
回答3:我觉得这个没有办法实现因为你的工作就是Client向server发指令至于返回哪个寄存器里的值是server的事情除非他返回的值里包含了这些信息,要不然client是没有办法知道的.你这个可能要跟server沟通一下,让他们的返回值的里包含你需要的信息,你在client来抓应该是没办法抓
回答4:异步处理的话,发送方一般都有一个ID,在收到返馈时根据ID来判断是哪条指令的执行结果。}

我要回帖

更多关于 mips编程实现浮点数的 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信