日期:2014-05-16  浏览次数:20529 次

Socket编程之聊天程序 - 模拟Fins/ModBus协议通信过程

 

设备控制软件编程涉及到的基本通信方式主要有TCP/IP与串口,用到的数据通信协议有Fins与ModBus。 更高级别的通信如.net中的Remoting与WCF在进行C/S架构软件开发时会采用。


本篇文章结合Fins/ModBus协议的指令帧结构与数据编码与解码过程,自定义了一套TcpChatter数据数据通信协议,编写了一个聊天程序,说明TCP/IP的在一个项目中应用。


本文涉及到的源代码工程项目为 - TcpChatter 后面附件提供源代码下载 ( OpenSource Code   软件版本:VS2008    语言:C#)


1 先普及几个基本概念



Socket

接触C/C++的人都知道,编写网络程序会用到Socket,对于Socket编程,其基本编程思想就是使用listen,accept,connect,send与write等几个操作来实现客户端与服务端的通信。
对于使用C#的程序员,.net为我们提供了Socket类来编写服务程序,提供了TcpClient来编写客户端程序。我们只需要知道如何使用listen,accept,connect,send与write操作就能编写我们需要的网络程序了。

简单的说:
Socket是支持TCP/IP协议的网络通信的基本操作单元,它是建立在TCP/IP协议上的一组编程接口,是我们编写代码,使用TCP/IP进行数据通信的入口,它是对TCP/IP协议栈的抽像,等效于是TCP/IP协议栈提供的对外编程接口,在.net中,只是说这个编程接口的实现由Micosoft为我们完成,我们做的唯一工作只是使用这些接口就能在我们的应用程序间进行TCP/IP通信了


TCP/IP - Transmission Control Protocol/Internet Protocol

传输控制协议/因特网互联协议,是Internet互联网络的基础,由传输层的TCP协议与网络层的IP协议构成。网络层负责在节点与节点之间传送数据包(IP数据包),该IP数据包由TCP协议来进行组装,IP数据包再通过它的下层协议以太网协议 (IEEE802)在光纤上进行传输,从而将不同的信息从一台计算机传送到了另一台计算机。

对于程序员,我们编写的程序要在不同的计算机间进行数据通信,可以通过Socket编程来使用TCP/IP,从而将我们的数据从一台计算机传到了另一台计算机。


PLC - Programmable Logic Controller
可编程逻辑控制器,一种数字运算操作的电子系统,专为工业环境应用而设计,与计算机一样,可以把它看成是一种用于工业控制的计算机,它也有自己的编程语言 - T形图,可以通过T形图编程来实现各种设备的控制。

Fins - Factory Interface Network Service
Fins协议是欧姆龙开发的用于工业自动化控制网络的指令/响应通信协议,它借助TCP/IP协议与串口通信协议,通过发送Fins指令实现在各种网络间的无缝通信,这里主工是PC与PLC的通信,我们PC可以通过发送Fins指令与PLC进行通信。

ModBus
Modbus是由Modicon公司于1979年发明,是全球第一个真正用于工业现场的总线协议。在工业控制系统中,目前ModBus已经成为一通用工业标准.
Modbus主要应用于电子控制器上的一种通用数据协议,借助TCP/IP协议与串口通信协议,通过发送Modbus指令实现在各种设备之间的通信。目前公司的温控表与PC间的通信采用ModBus。


2 TcpChatter消息传输结构



2.1 TcpChatter软件架构

与传统的软件系统一样,TcpChatter采用C/S架构,即客户端/服务端架构,Client参与通信会话,Server不参与通信会话,只负责将Client的消息通过Server进行转发,从而实现Client-Client间的通信。
整个TcpChatter的代码结构由 ChatServer + ChatClient构成

2.2 TcpChatter消息处理

如下图所示TcpChatterMessageTransaction,为TcpChatter系统中使用的消息处理结构。下图异展示了从 客户端A←→客户端B 的消息传递过程。

2.3 TcpChatter消息处理原理

在不同的客户端进行通信,客户端通过将消息封装为TcpChatter指定的数据格式 [TcpChater指令 + 数据]  然后发送给服务端程序ChatServer,服务端程序再将消息转发给指定的客户端,客户端收到消息后解析TcpChater数据包然后做其它的处理。




3  TcpChatter指令帧结构



目前工业控制中的温控主流采用串口通信,使用数据通信协议为ModBus协议,而与底层PLC通信则多采用Fins协议。下面分别解释ModBus协议与Fins协议的指令帧结构与TcpChatter指令帧结构。


TcpChatter指令 帧用于在客户端与服务端进行统一格式的数据通信。其基本构成为 : TcpChatter指令域 + TcpChatter数据域;

Fins协议与ModBus协议原理基本一样,其各自的指令帧结构 基本有2部分构成: 指令域 + 数据域
指令域为Fins协议与ModBus协议定义的数据通信格式,指令域字节长度也不一样.比如Fins指令有效指令域(Fin头 + Fin指令域)为12个节字,数据域长度能到2000字节,而ModBus协议有效指令域(地址 + 功能码 + CRC校验码)为4个字节,数据域为(256-4)字节或(260-4)字节。
数据域为发送的真正数据。由于受限于硬件设备通信的数据速率, 在串口与TCP/IP通信中, 指令域 + 数据域的总长度是有限制的。我们通过PC与设备进行通信,实际上是在反复的发送这些 数据包与解析这些数据包,从而达到PC与设备信息交互的目的。

熟悉嵌入式的人都知道,我们编写代码跟设备进行通信,基本是在通过操作设备的寄存器对寄存器进行读写从而达到控制设备状态与获取设备状态的目的。寄存器普通的有8位与16