background image

第 11 期

陈立定, 等: 远程环境在线监测系统的设计

殊标志位寄存器 SMB30 的值, 就可以改变通信的波
特率、

奇偶校验位、

停止位等信息. 这些 设定必须与

G PR S DT U 的相关参数值相一致. 串口初始化子程
序只在每次 P LC 重启时运行一次.

图 2 PL C 程序流程图

Fig. 2

Program flow of PLC

2. 2. 2 实时数据发送子程序

S7- 200 系列 PL C 有专用的发送指令 X M T ,

其格式为 XM T _T ABLE_PORT . 接收指令为 RCV,
其格式为 RCV_T ABL E_PORT , 其中 P ORT 为通信
端口, 本系统设为端口 0, T ABLE 为发送 ( 接收) 数
据的数据缓冲区, 其第 1 个字节为发送字符的个数,
最大为 255 字节.

在本系统中, 监测的设备都是比较大型的设备,

不会频繁启停, 也就是说监控对象的状态不会频繁
地发生变化, 每隔 30 s 发送一次实时数据到数据中
心, 已经可以满足系统的实时性要求.
2. 2. 3 历史数据存储子程序

系统将采集到的生产设备和治污设备的开关量

信息( 2 字节) , 隔 5 min 存储一次到历史数据表中.
考虑到要进行历史数据补足查询, 每 8 h( 192 字节)
数据作为一个数据存储单元, 再加上数据头和数据
尾等信息, 一个 数据区 200 个字节. 历史 数据保 存
7 d 需要 4 200 字节, 在 PL C 内存中就可以存储最近

7 d 内的历史数据. PL C 程序使用时钟信息确定每个
数据具体的存储位置.
2. 2. 4 历史数据查询子程序

P LC 利用时钟信号控制自由端口通信, 让 P L C

在每天指定的时间段内, 允许数据中心服务器对下
位机进行历史数据查询. 当进行数据补足时, 就将缺
失数据所在的数据区的数据( 200 字节) 全部发送到
数据中心服务器, 确保数据库历史数据的完整.

查询结束后, 自动返回到 PL C 主动发送实时数

据模式.

3 上位机程序设计

3. 1 Winsock 控件原理

对数 据进 行可 靠 的接 收 是整 个 系统 的 关键.

Socket 流式套接字是一种针对 T CP 的面向 连接的

套接字. 直接采用 So cket 技术来实现数据中心服务
器和远程数据终端通信比较复杂. 因此, 采用集成了

Socket 技术的 W inso ck 控件.

Winsock 控件 是微 软 Window s 提供 的网络 编

程接口, 提供了基于 T CP/ IP 协议的接口实现方法.
它 把 与 网 络 通 信 相 关 的 Window s Sockets API

( applicat ion prog ramming int er face, 应用程序接口)
函数封装成为一个整体. 将网络编程要用的函数作
为控件的属性和方法. 通过对控件相关属性的设置
和方法的调用就可以实现稳定的网络通信功能. 该
控 件 为 用 户 提 供 了 访 问 T CP 和 U DP ( user

dat agram prot oco l, 用户数据包协议) 网络的极其方
便的 途 径, 并 且 适 用 于 M icro soft Access, Visual

Basic, V isual C++ 和 V isual Fo xP ro 等多种 可视化
编程环境.

本系统有多台数据终端, 要为每台数据 终端建

立一 个线 程, 负责 实 时 高 效 的 接 收 和 发 送数 据.

V isual Basic 6. 0 的 Winsock 控件数组可以 很方便

地实现这一功能, 因此采用 Visual Basic 6. 0 开发上
位机程序.

图 3 表示单台数据终端与服务器数据中心进行

数据交互的过程. 当有多台数据终端时, 数据终端与
服务器建立连接进行数据交互的过程相同, 只需要
增加新的 Winsock 控件实例, 这里使用控件数组. 具
体方 法 是: 在窗 体 中 加 入 Winsock 控件, 命 名 为

L ist ener, 将它的 Index 属性设置为 0. 作为 Winsock
控件数组的第一个元素. 然后在窗体的 L oad 事件中
声明一个模块级的变量 Count, 把 Count 设置为 0,
数组中的第一个控件的 L o cal port 属性设置为 1011

( 与 G PR S D T U 中一致) , 接着调用控件的 L ist en 方

法. 然后在连接请求时, 代码将检测 Index 是否为 0,
如果为 0, 监听控件将增加 Count 的值, 并使用该号
码来创建新的控件实例, 然后使用新的控件实例接
受新的连接请求. 这样就可以完成多台终端与服务
器数据中心通信程序的设计.

1661