资源描述:
《虚拟设备实现modbus串行链路与modbus-tcpip的互连》由会员上传分享,免费在线阅读,更多相关内容在学术论文-天天文库。
1、虚拟设备实现Modbus串行链路与Modbus/TCPIP的互连 【】Modbus作为第一个用于工业现场的总线协议,应用极其广泛,他包括基于串口的Modbus协议和基于以太X的Modbus/TCPIP协议。文章描述了通过虚拟设备实现了这两种通讯方式的互联并给出了实现细节,提出了虚拟技术具有广泛的应用领域。 【关键词】虚拟串口;TDI驱动;Modbus Virtualdevicemaketheconnectionbetp;AUTOMATIONCO,LTD.Liaoning110168) Abst
2、ract:Modbusisappliedunicationandgivetherealizationindetails,putforbolicLink创建一个名为DosDevices(n对应串口号)的设备,这样应用程序就可以通过CreateFile函数对这个串口设备进行打开了。 (3)接下来是虚拟串口设备与TCP/IP协议驱动进行交互,是通过协议驱动所创建的设备对象名字DeviceTcp和DeviceUdp,因为本例中是与Modbus/TCPIP交互,所以应绑定DeviceTcp设备名
3、。通过这个名字调用内核函数Ze域赋值TdiTransportAddress,返回一个代表传输地址的文件对象,第二次打开操作通过对pEa结构的EaName域赋值TdiConnectionContext,返回一个代表连接端点的文件对象(如果是面向无连接的UDP操作,则不需要这个对象),通过向下层提交TDI_ASSOCIATIOM_ADDRESSIOCTL码的方式在已打开的连接和已打开的传输地址之间建立联系。接下来就可以进行连接操作(客户端)或者等待接受对方的连接(服务端)。 (4)当作为Modbus主站(客
4、户端)时,需通过TDI函数向对方发起一个连接,首先需要知道对方的远程IP地址和端口号,因为Modbus端口号已经被固定分配,所以这里端口号可以采用硬编码的方式,为了动态获得远程IP地址,可以在应用程序中将其写入注册表,在此时读出即可。一般来说,在对TDI传输器进行任何操作之前,都需要通过TdiBuildInternalDeviceControlIrp函数创建一个IRP(I/O请求包),把操作类型参数设置成需要操作的类型,如连接操作则设置为TDI_CONNECT值。接下来把从注册表读出的远程IP地址和端口号
5、赋值给TDI_CONNECTION_INFORMATION结构中的TA_IP_ADDRESS中的对应变量,在TdiBuildConnect函数中代入之前需创建好的IRP和TDI_CONNECTION_INFORMATION结构,把IRP设置成连接请求的IRP。最终通过IoCallDriver函数将其下发到底层设备。这个连接IRP绑定了一个事件,如果返回状态为pending值,则调用KeATION RmtNode={0,0,0,0,sizeof(RmtIPAddr),RmtIPAddr}; TdiBui
6、ldConnect(pIrp,pTcpDevObj, pConnFileObj,NULL,NULL,NULL,RmtNode,0); status=IoCallDriver(pTcpDevObj,pIrp); if(STATUS_PENDING==status) Keode,FALSE,0); 对于读请求可以有两种方式处理,一种是当串口读请求到来时先返回pending值,并通过TDI函数创建一个操作类型值为TDI_RECEIVE的IRP进行下发。另一种方式是申请一个环状缓冲区,向TDI传输器注册
7、一个面向端端连接的读回调例程,当有数据到达传输层时,传输层将调用注册的回调函数,参数中携带收到数据缓冲区的指针与长度,在回调函数把数据拷贝到我们已经申请号的环状缓冲区中,当串口读请求到来时只需在定时器时间到时查看环状缓冲区中是否有可读数据,如有则填充完成IRP返回,如缓冲区为空则返回失败。对于写请求与断开连接操作都与连接请求的处理方式类似。 (5)当作为Modbus从站(服务端)时,需监听到来的连接并判断是否要与其进行端端连接,为了监听连接需注册一个连接回调函数。当下层驱动调用时,从参数中取得对方的地址
8、信息,其中有两个参数是需要填充返回的,一个是连接上下文信息(CONNECTION_CONTEXT*ppConnCtx),一个是接收IRP指针(PIRP*ppIrp),从回调函数参数中取得对方的地址信息为CONNECTION_CONTEXT结构赋值,然后调用TdiBuildAccept函数,其参数包括一个已创建好的用于处理接受连接请求的IRP,一个已创建并绑定到已打开的传输地址文件对象上的连接端点文件对象,接受连接请求IRP的完