/////////////////////////////////////////////////////////////////////////////
// Name: 说明.txt
// Purpose: 就是一个说明
// Author: Hongye lhy.hbg@gmail.com
// Modified by:
// Created: 2010-3-17
// RCS-ID:
// Copyright: Copyright (c) 2010 Hongye Liu
// Licence: LGPL
/////////////////////////////////////////////////////////////////////////////
Serial HostLink 说明
====================
介绍:
-----
Serial HostLink是实现欧姆龙CS/CJ系列PLC与上位PC机串口通信的C++源代码库。
包括三个文件: 代码文件HostLink.cpp, 头文件HostLink.h和HostLinkInner.h。
使用了C库函数和C++ STL,不依赖其他库。
使用了Visual C++ 6.0编译调试
三个文件主要实现了HostLink类,通信任务通过HostLink类的函数来实现。
针对CS/CJ系列PLC,主要实现了WR,CIO,HR,DM,EM五个区域的数据的读写。
读取函数可读取WR,CIO,HR以及DM、EM区10000以下的任意字。
写入函数可设置这5个区的任意字或位。
读取函数除WR区外,均是用了基于HostLink的C-模式命令。C-模式命令不支持WR区读写。
读取WR区和写入函数采用了HostLink封装的FINS命令。
鉴于程序执行速度和串口通信速率不匹配,读写函数均有两种方式:同步方式与重叠方式。
同步方式函数调用中,在串口通信完成之前不返回,处于等待状态,会阻塞程序。
并且操作并不能立即执行,而是等待通信空闲时执行,函数的返回结果指示这次通信成功与否。
重叠方式中,写入函数只是做一个通信请求,并准备好数据,便返回。不保证通信与写入成功。
读取数据时,先要设置读取区域,通信程序会周期性(100ms)从PLC读取数据到此区域。
重叠读取函数仅仅是从此区域读取数据,速度很快。
相对于PLC的数据,会有延迟。
两种通信方法中都不保证操作的正确实施!!!
异常或错误处理未通知应用程序,只有Debug版本在内部进行了诊断输出。
适用情况:
---------
欧姆龙CS/CJ系列PLC,与上位计算机一对一串行通信,PLC与计算机直接链接,不经过网络。
PLC单元号为0(可在PLC编程软件CX-P中设置,初始设置是0)。
计算机边与PLC边串口设置相同,具体连线可为:
使用方法:
---------
把三个文件HostLink.cpp, HostLink.h 和HostLinkInner.h添加到工程中。
使用Visual C++时,默认会使用预编译头文件,编译会报错。
对于HostLink.cpp的编译选项,选择不使用预编译头文件。
生成HostLink对象(#include HostLink.h)
调用Open函数,打开串口。
执行读写函数,与PLC进行通信。若重叠方式读,则要先设置读区域。
显式调用关闭函数后,释放对象,或直接释放对象,在析构函数中释放资源。
附带说明:
---------
此代码仅作参考,不能用于工业应用,作者对由此造成的一切问题不承担任何责任。
有用函数参考:
-------------
HostLink::HostLink
HostLink();
默认构造函数
HostLink::HostLink(LPCTSTR ComPort, SDCB CommSet);
带打开操作的构造函数
参数:
见OpenComm
HostLink::OpenComm
bool OpenComm(LPCTSTR CommPort, SDCB CommSet);
打开串口操作
返回值:
成功true,否则false
参数:
CommPort
C字符串常量,指定打开的串口,一般位"COM1","COM2","COM3"等,取决于计算机
CommmSet
SDCB结构数据,设置串口参数如波特率,数据位,奇偶校验位,停止位。
SDCB定义如下
typedef struct _SDCB
{
DWORD BaudRate; /* Baudrate at which running */
BYTE ByteSize; /* Number of bits/byte, 4-8 */
BYTE Parity; /* 0-4=None,Odd,Even,Mark,Space */
BYTE StopBits; /* 0,1,2 = 1, 1.5, 2 */
} SDCB;
HostLink::CloseComm
bool CloseComm();
关闭串口操作
返回值:
成功true,否则false
HostLink::SSetCommState
bool SSetCommState(SDCB CommSet);
简单设置串口参数
返回值:
成功true,否则false
参数:
CommSet 参见HostLink::OpenComm
HostLink::AddReadArea
bool AddReadArea(MemArea area, UINT unBeginWord, UINT unWordsCount);
为重叠读取函数设置/添加读取区域
返回值:
成功true,否则false
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
区域开始字地址,有效范围参见上文提到的限制和PLC各个区域的长度
unWordsCount
指定读取区域字的个数(从开始字开始的连续字数)
HostLink::ClearReadArea
bool ClearReadArea();
清空读取区域,停止周期性读取任务,降低串口与CPU的使用率。
返回值:
成功true,否则false
HostLink::ReadPLCWord
WORD ReadPLCWord(MemArea area, UINT unBeginWord);
重叠方式从PLC中读取字
返回值:
返回读取的字
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
读取字地址,有效范围参见PLC各个区域的长度
HostLink::ReadPLCWordWait
WORD ReadPLCWordWait(MemArea area, UINT unBeginWord, UINT unMilliseconds = 500)
非重叠方式从PLC中读取字
返回值:
返回读取的字
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
读取字地址,有效范围参见PLC各个区域的长度
unMilliseconds
等待时间, 单位ms. 若串口操作没有响应,则此函数(耗时最长情况)在指定的时间内返回
HostLink::WritePLCWord
bool WritePLCWord(MemArea area, UINT unBeginWord, WORD wValue);
重叠方式向PLC中写入字
返回值:
无意义
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
写入字地址,有效范围参见PLC各个区域的长度
wValue
要写入的值
HostLink::WritePLCWordWait
bool WritePLCWordWait(MemArea area, UINT unBeginWord, WORD wValue, UINT unMilliseconds = 500);
非重叠方式向PLC中写入字
返回值:
false表示超时返回
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
写入字地址,有效范围参见PLC各个区域的长度
wValue
要写入的值
unMilliseconds
等待时间, 单位ms. 若串口操作没有响应,则此函数(耗时最长情况)在指定的时间内返回
HostLink::WritePLCBit
bool WritePLCBit(MemArea area, UINT unBeginWord, UINT unBit, WORD wValue);
重叠方式向PLC中写入一位
返回值:
无意义
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
写入字地址,有效范围参见PLC各个区域的长度
unBit
写入字的位地址,0到15位
wValue
要写入的值, 0表示复位,其他值置位
HostLink::WritePLCBitWait
bool WritePLCBitWait(MemArea area, UINT unBeginWord, UINT unBit, WORD wValue,
UINT unMilliseconds = 500);
重叠方式向PLC中写入一位
返回值:
false表示超时返回
参数:
area
MemArea型枚举值(WR, CIO, HR, DM, EM),指定PLC的存储区域
unBeginWord
写入字地址,有效范围参见PLC各个区域的长度
unBit
写入字的位地址,0到15位
wValue
要写入的值, 0表示复位,其他值置位
unMilliseconds
等待时间, 单位ms. 若串口操作没有响应,则此函数(耗时最长情况)在指定的时间内返回
存在问题:
---------
1. EM区不统一,有的是当前Rank,有的是0Rank
2. 无循环任务时,可完全进入等待状态
3. 一些数值区间限制问题,如MemArea的限制,各区长度的限制
4. 结果值超过一帧时,似乎不对
5. 似乎有内存泄露. 在对话框程序中, 不使用MFC的预编译, 不包括头文件stdafx.h
时,有内存泄露
- 1
- 2
- 3
- 4
- 5
前往页