第一章 产品简介
1. 产品介绍
金南瓜SECS/GEM是最适应于全自动智能设备的选择。 DMS SECS/GEM具有怪兽级的强劲性能,全面升级的高适应性,易用友好的SECS工具,利于快速开发部署。
金南瓜SECS/GEM兼容运行在独自工控机,或与设备软件集成在一台工控机,让用户灵活应对各种使用场景。
2. 软件清单与展示

全部软件目录清单
2.1软件清单
1 SECS/GEM用户
提供EquipViewApp.exe和HostViewApp.exe俩款demo软件,分别对应的场景是设备端和主机端模拟。
移植所需文件

红色框内为所需文件
2. PLC SECS/GEM用户
提供EquipViewApp.exe、 PlcSecsControlView.exe和HostViewApp.exe软件,分别对应的场景是设备端、PLC连接器和主机EAP端模拟。
3. GEM300用户
额外提供EquipViewApp300.exe和HostViewApp300.exe测试软件,分别对应的GEM300设备端和主机端模拟。
2.2 模拟软件展示
1. 设备端模拟软件EquipViewApp

4. SECS/GEM300模拟软件EquipViewApp300

5. 其他软件
- 后台服务进程JNG_Server.exe
2.3 其他文件介绍
- SecsConfig 文件夹中主要的文件
- licenses.ini 为运行许可,可选用加密狗或licenses.ini方式授权
- 配置文件:
- Alarm.csv 为警报信息表(ALID)
- EC.csv 为设备常量表(ECID)
- Event.csv 为设备常量表(CEID)
- SV.csv 为用户软件的设备常量表(SVID/VID)
- PlcSecsData文件夹为PLC的配置档,保存客户与PLC通讯的各类数据。
3. 开发环境
1. 编程语言
主流语言 C、C++、C#、Labview
2 运行环境
Windows XP SP3
windows 7
windows 10
3 开发工具
LabVIEW、VC6.0、QT、Visual Studio 2008及以上
4 硬件环境
硬件:
PC工控机
接口:
RJ45或者光纤以太网网口 1个
第二章 软件使用
4. 软件获取
4.1 获取金南瓜SECS SDK
用户可以在我们的网站上下载开发包文件。
http://www.secsgem.cn
下载地址http://download.semisecs.com
4.2 获取运行许可
1. 如果为加密狗方式,将加密狗插入USB接口即可
2. 运行文件许可方式
- 运行licenseClient获取PC的序列号GUID
- 将获取到的GUID发送给厂商
- 将金南瓜给予的license替换/JngServer/SecsConfig/license.ini文件夹里面原来的许可。
4.3 软件使用
1. 参考 “Demo使用介绍书(日期).pdf”操作使用书
第三章 开发指导
5 软件交互流程
SDK与设备软件交互关系图
5.1 初始化SECS/GEM SDK模块
1. 初始化SDK dll模块
2. 设置各类参数、回调函数等
3. 设置控制模式(OFFLINE或ONLINE)
4. 启用通讯
初始化流程
5.2 SECS/GEM SDK与设备之间交互
1. 通讯状态发生改变时,SDK通过回调函数实时反馈给设备
例如:
通讯状态
控制状态
2. 设备发生事件时,调用EventPos API通知SDK
3. 设备发生Alarm时,调用Alarm Set API通知SDK
4. 服务器发送远程命令给设备,SDK通过远程命令回调函数通知设备

6 数据配置
作用:
SECS/GEM 将变量、事件、警报等数据含义配置给SDK
配置文件目录:
SECS/GEM在../JngServer/SecsConfig/当中
类型映射表
|
secs code |
JNG 类型代码 |
Meaning & Examples |
|
00 |
L |
List类型 |
|
10 |
B |
binary – unsigned 8 bit data: 二进制类型 “0x00” “0x01 0x02 0x03” |
|
11 |
TF |
boolean data: 布尔类型 TF 1 非零代表true TF 0 零代表false |
|
20 |
A |
Character string data: ASCII字符串类型 “A {hello world}” “A hello” |
|
30 |
I8 |
8-byte signed integer |
|
31 |
I1 |
1-byte signed integer |
|
32 |
I2 |
2-byte signed integer |
|
34 |
I4 |
4-byte integer signed |
|
40 |
F4 |
8-byte floating point |
|
44 |
F8 |
4-byte floating point |
|
50 |
U8 |
8-byte unsigned integer |
|
51 |
U1 |
1-byte unsigned integer |
|
52 |
U2 |
2-byte unsigned integer |
|
54 |
U4 |
4-byte unsigned integer |
6.1 变量添加
通过SV.csv方法添加
- ID建议
- TYPE类型:L、A、TF、B、U1、U2、U4、I1、I2、I4、F4、F8
- CLASS一般为SV
- Int value 一般为空
- Units为单位
- callback为通过回调方式访问最新值

6.2 事件添加
通过Event.csv方法添加

6.3 警报添加
通过alarm.csv方法添加
- ID 是唯一性的
7 C/C++二次开发
这部分内容针对于PC端的C++语言二次开发
7.1 编译器配置改动:
8.1.1 编译器 VC6 配置
无需改动
8.1.2 SECS/GEM 编译器 C++ Builder 6 配置
需要修改代码
1. 启用“SecsPortExport.h”的宏定义 #define __CPP_BUILDER__

原来没有启用
、
启用宏定义
2. 删除“Group.cpp”、“SecsBase.cpp”和“SecsEquip.cpp”第一行的 #include “stdafx.h”

3. SECS/GEM 用C++ Builder 6 的implib.exe将SecsPort.lib转换成C++ Builder 6所能支持的格式


7.2 初始化SDK
在使用SECS通讯之前需要调用Start函数进行初始化dll模块。
接口:
void Start(string pServerAddr, int nPort);
例子:
m_pSecs = new CSecsEquip();
// 连接服务器
RcResult rc = m_pSecs->Start();
7.3 初始化参数
初始化SECS/GEM通讯的各项参数,例如IP、端口号、device ID等。
接口:
1. SECS连接参数的接口
设置通讯对方的TCP/IP地址
RcResult SetIP(string ip);
设置TCP/IP通讯的端口号
RcResult SetPort(int port);
设置主动/被动的TCP/IP通讯模式
RcResult SetPassive(bool bPassive);
设置设备型号名称
RcResult SetMDLN(string pMDLN);
设置会话ID
RcResult SetDeviceID(int nDeviceID);SetT1();
设置各种场景的超时
RcResult SetT1(int nTimeout);
RcResult SetT2(int nTimeout);
RcResult SetT3(int nTimeout);
RcResult SetT4(int nTimeout);
RcResult SetT5(int nTimeout);
RcResult SetT6(int nTimeout);
RcResult SetT7(int nTimeout);
RcResult SetT8(int nTimeout);
2. 加载CSV数据
加载指定的数据CSV配置
RcResult LoadDataByCsvFile(string pDir = “”);
3. 设置响应函数
SecsStateChangeProc* m_pStateChangeCallback; // 状态改变回调SecsTerminalProc* m_pTerminalCallback; // 终端信息回调
SecsRemoteProc* m_pRemoteCallback; // 远程控制回调
4. 如果需要多线程同步,可以同步对象
回调函数会附带该参数
void SetClientData(void* pClientData);
5. 设置控制模式
设置控制状态
RcResult SetControlMode(CONTROL_MODE state);
6. 增加变量、事件、警报等
增加方法参考后面对应名称
例子:
m_pSecs = new CSecsEquip();
// 连接服务器
RcResult rc = m_pSecs->Start();
if (rc.rc != 0)
{
MessageBox(rc.ToString().c_str(), “JNG_Server.exe没有初始化”);
// 暴力退出不推荐
exit(0);
}
// 初始化其他
// 设置参数
rc = m_pSecs->SetIP(g_appdata.m_pAddress);
rc = m_pSecs->SetPort(g_appdata.m_nPort);
rc = m_pSecs->SetPassive(g_appdata.m_bPassive);
rc = m_pSecs->SetDeviceID(g_appdata.m_nDeviceID);
rc = m_pSecs->SetMDLN(g_appdata.m_pInterfaceName);
rc = m_pSecs->SetEnableLog(g_appdata.m_bEnableLog);
rc = m_pSecs->SetT1(g_appdata.m_nTimeout[0]);
rc = m_pSecs->SetT2(g_appdata.m_nTimeout[1]);
rc = m_pSecs->SetT3(g_appdata.m_nTimeout[2]);
rc = m_pSecs->SetT4(g_appdata.m_nTimeout[3]);
rc = m_pSecs->SetT5(g_appdata.m_nTimeout[4]);
rc = m_pSecs->SetT6(g_appdata.m_nTimeout[5]);
rc = m_pSecs->SetT7(g_appdata.m_nTimeout[6]);
// 设置回调
m_pSecs->SetClientData(this);
m_pSecs->m_pTerminalCallback = ::OnTerminalProc;
m_pSecs->m_pStateChangeCallback = ::OnStateChangeProc;
m_pSecs->m_pRemoteCallback = ::OnRemoteProc;
// 示例的回调内容结束
// 通过Csv文件加载配置
rc = m_pSecs->LoadDataByCsvFile();
// 建立通讯
rc = m_pSecs->SetControlMode((CONTROL_MODE)g_appdata.m_nControlMode);
if(g_appdata.m_bCommEnable)
{
rc = m_pSecs->CommEnable();
SHOW_MSG_RC(rc);
}
return true;
7.4 建立通讯
1. 调用接口API开始通讯
CommEnable();
7.5 变量设置
更新变量数据的方式
- 采用设置方法
VariableSet();
7.6 事件发送
通过API函数发送事件
EventPos();
7.7 警报设置/清除
通过API函数设置/清除警报
AlarmSet(ID, true/false);
true为设置
false为清除
8 C# SECS/GEM 二次开发
这部分内容针对于PC端的C#语言二次开发
接口名称和作用跟C++一致
注意:
工程师需要将SecsBase和SecsEquip俩个C#项目重新编译
1. 将项目的net版本选择与设备软件一致的版本

2. 编译生成DLL文件,将DLL文件添加到设备软件项目当中
8.1 初始化SDK
创建一个SECS通讯对象
public CSecsEquip m_pSecs = new CSecsEquip();
金南瓜SDK软件使用之前必须先对其初始化
初始化方法:
1. 调用开始接口
void Start(string pServerAddr, int nPort);
2. 使用例子
Start();
8.2 初始化参数
1. 设置SECS连接参数
SetIP();
SetPort();
SetPassive();
SetMDLN();
SetT1();
SetT2();
SetT3();
SetT4();
SetT5();
SetT6();
SetT7();
2. 加载CSV数据
LoadDataByCsvFile();
3. 设置响应/委托函数
m_pOnCommState 通讯状态改变通知
m_pOnControlState 控制状态改变通知
m_pOnRemoteCommand 远程命令通知
m_pOnTerminal 终端消息通知
4. 设置处理对象指针
SetClientData();
5. 设置控制模式
SetControlMode();
6. 增加变量、事件、警报等
增加方法参考后面对应名称
8.3 建立通讯
1. 调用接口API开始通讯
CommEnable();
8.4 变量设置
更新变量数据的方式
- 采用设置方法
VariableSet();
8.5 事件发送
通过API函数发送事件
EventPos();
8.6 警报设置/清除
通过API函数设置/清除警报
AlarmSet(ID, true/false);
true为设置
false为清除
第四章 常见问题与解决
9 问题与场景
9.1 笔记本控制设备
场景: 笔记本通过SECS控制设备
需要材料:一根网线
接线:用网线将设备和笔记本网口相接
配置方法:
1. 将设备配置成“设备配置图1”的网络配置。
2. 笔记本配置成“笔记本配置图2”的网络配置。

设备配置图1 笔记本配置图2
3. 将设备端SECS设置为被动模式,启动通讯
4. 将笔记本的SECS Host端配置为主动模式,IP地址为192.168.1.1,启用通讯就能通讯上。
可能出现的问题:
1. 如果使用笔记本跟设备电脑连接,如果任一电脑加公司域。该情况有可能无法连接。
9.2 防火墙导致无法通讯
现象:
1. 使用cmd的ping可以对俩台电脑进行测试通畅
2. 模拟器在本地通讯测试没问题,俩台电脑时候却无法通讯
可能出错原因:
1. 防火墙拦截住通讯连接,将防火墙关闭再测试
10 错误代码
错误代码 |
描述 |
|
1001 |
没有发现处理对象 |
|
1002 |
数据错误 |
|
1003 |
DLL加载失败 |
|
1010 |
没有连接到对方 |
|
1011 |
读取文件失败 |
|
1012 |
读取文件失败 |
|
1013 |
打开文件失败 |
|
1014 |
删除文件失败 |
|
1015 |
目录或路径为空 |
|
1020 |
消息答复数据错误 |
|
2001 |
大括号中的列表元素,后边跟非空格 |
|
2002 |
引号中的列表元素,后边跟非空格 |
|
2003 |
列表元素中存在开放性的引号(不成对) |
|
2004 |
列表元素中存在开放性的括号(不成对) |
|
3100 |
不支持 |
|
3101 |
链接状态中 |
|
3102 |
分配内存失败 |
|
3103 |
没有连接 |
|
3104 |
指针为空 |
|
3105 |
数据有误 |
|
3106 |
加载DLL失败 |
|
3107 |
许可没有发现 |
|
3108 |
许可没有发现 |
|
3109 |
没有处理对象 |
|
3110 |
没有给客户数据,导致无法处理 |
|
6105 |
函数的数据有误,将出现的场景反馈给工程师处理 |
|
6121 |
event不存在,请先添加secs event对象,再使用event |
|
6123 |
event的名称太长,event名称长度不能超过300字节 |
|
6124 |
Constant没有找到数据 |
|
6126 |
终端服务反馈数据错误 |
|
6127 |
终端服务被对方拒绝,S10F0终止 |
|
6134 |
操作的文件太大,最大支持16M |
|
6136 |
服务器答复的数据不符合SECS要求 |
|
6140 |
服务器答复PP的数据是错误的,不符合SECS要求 |
|
6141 |
服务器答复PP名称与请求的PP名称不符 |
|
6142 |
Constant的值超出Constant设置的最大、最小值 |
|
6145 |
数据格式不属于SECS数据类型格式,请参考数据类型手册 |
|
6150 |
压缩文件失败,请查看软件权限是否满足,或者文件需要管理员身份才能处理 |
|
6151 |
解压文件失败,请验证文件是否属于压缩文件 |
|
6152 |
Winrar.exe软件没有找到,请查看rar路径是否正确 |
|
6160 |
PPID没有发现,请查看pp回调函数是否已经正确处理 |
|
6162 |
处理程式发送:服务器答复ACK7其他错误 |
|
6170 |
处理程式授权:已经有对象 |
|
6171 |
处理程式授权:没有空间 |
|
6172 |
处理程式授权:无效的PPID |
|
6173 |
处理程式授权:忙,请稍后 |
|
6174 |
处理程式授权:不接受 |
|
6175 |
处理程式授权:其他错误 |
|
9100 |
不支持 |
|
9101 |
链接状态中 |
|
9102 |
通讯没有初始化 |
|
9103 |
分配内存失败 |
|
9104 |
没有连接 |
|
9105 |
指针为空 |
|
9106 |
数据有误 |
|
9107 |
加载DLL失败 |
|
9120 |
没有连接 |
|
9121 |
dmh没有加载 |
|
12100 |
不支持 |
|
12101 |
链接状态中 |
|
12102 |
分配内存失败 |
|
12103 |
没有连接 |
|
12104 |
指针为空 |
|
12105 |
数据有误 |
|
12106 |
数据为空 |
|
12107 |
DataBase没有发现,或者vc14没有安装 |
|
18100 |
不支持 |
|
18101 |
链接状态中 |
|
18102 |
分配内存失败 |
|
18103 |
没有连接 |
|
18104 |
指针为空 |
|
18105 |
数据有误 |
|
18106 |
数据为空 |
|
18107 |
数据Server Dll没有发现 |
|
18108 |
调用SOCKET函数失败 |
|
18109 |
调用BIND函数失败 |
|
18110 |
调用LISTEN函数失败 |
|
18111 |
SOCKET对象错误 |
|
18112 |
没有RPC端口号 |
|
18113 |
创建发送线程失败 |
|
18114 |
创建接收线程失败 |
|
18115 |
创建接收数据处理线程失败 |
|
18116 |
不能初始化,状态在非空闲 |
|
18117 |
等待超时 |
|
18119 |
没有找到返回数据 |
|
18120 |
目标描述为空 |
|
18130 |
不允许非字符串开头 |
|
18131 |
字符串必须是ASCII |
|
18132 |
没有连接对象 |
|
18140 |
发送数据为空 |
|
18141 |
接收数据地址为空 |
|
18142 |
还没连接客户端 |
|
18143 |
接受者描述字符为空 |
|
21100 |
已经存在连接 |
|
21101 |
还没连接服务器 |
|
21102 |
分配内存失败 |
|
21103 |
SOCKET对象错误,无法建立通讯 |
|
21104 |
发送数据为空 |
|
21105 |
接收数据地址为空 |
|
21106 |
创建socket失败 |
|
21107 |
连接服务器失败 |
|
21108 |
服务器反馈数据错误 |
|
21109 |
创建发送线程失败 |
|
21110 |
创建接收线程失败 |
|
21111 |
没有找到返回数据 |
|
21112 |
等待超时 |
|
21113 |
不能初始化,状态在非空闲 |
|
21114 |
接受者描述字符为空 |
|
21115 |
目标描述为空 |
|
21116 |
开始字符必须是ANSI |
|
21117 |
字符不允许出现 -, _, ., !, :, or @ |
|
21130 |
创建接收处理线程失败 |
|
24100 |
已经存在连接 |
|
24101 |
还没连接服务器 |
|
24102 |
分配内存失败 |
|
24103 |
等待超时 |
|
24104 |
创建服务器进程失败,检查JND_server,或者打开JND_server权限不够 |
|
24105 |
没有发现服务器文件 |
|
24106 |
连接客户端Client DLL失败 |
|
24107 |
分配唯一名称失败 |
|
24108 |
T1超出范围: range 100..10000 |
|
24109 |
T2超出范围: range 200..25000 |
|
24110 |
T3超出范围: range 1000.. |
|
24111 |
T4超出范围: range 1000.. |
|
24112 |
T5超出范围: range 1000.. |
|
24113 |
T6超出范围: range 1000.. |
|
24114 |
T7超出范围: range 1000.. |
|
24115 |
T8超出范围: range 1000.. |
|
24116 |
参数错误 |
|
24117 |
IMCHandle为null |
|
24118 |
ALTX应该小于120个ASCII字符串 |
|
24119 |
需要完整的变量名称 |
|
24120 |
需要完整的变量描述 |
|
24131 |
设备常量描述太长 |
|
24132 |
设备常量名称太长 |
|
24133 |
设备常量需要输入数值类型 |
|
24141 |
事件描述太长 |
|
24142 |
事件名称太长 |
|
24150 |
服务器答复数据错误 |
|
24160 |
需要一个非空的回调 |
|
24165 |
主机接口处于正在连接状态 |
|
24166 |
主机接口主动退出 |
|
24169 |
事件ID小于1 |
|
24190 |
没有初始化或者初始化失败 |
|
27001 |
连接失败 |
|
27002 |
连接状态 |
|
27003 |
倾听状态 |
|
27004 |
调用SOCKET函数失败 |
|
27005 |
调用BIND函数失败 |
|
27006 |
调用LISTEN函数失败 |
|
27007 |
SOCK开始状态 |
|
27008 |
创建SOCK对象失败 |
|
27009 |
初始化网络失败 |
|
27010 |
已经初始化 |
|
27011 |
SOCKET对象错误 |
|
27012 |
发送数据错误 |
|
27013 |
错误的参数 |
|
27020 |
TCP/IP端口被占用 |
|
30009 |
字符错误 |
|
30010 |
不能初始化,不在空闲状态 |
|
30011 |
组名称受限在ASCII的字母、数字和下划线 |
|
30012 |
初始化socket失败 |
|
30013 |
创建通信失败 |
|
30014 |
参数错误 |
|
30015 |
发送错误 |
|
30016 |
发送等待接收超时 |
|
30020 |
没有连接对象 |
|
30045 |
十六进制转B(BINARY)格式错误 |
|
30046 |
十进制转B(BINARY)格式错误 |
|
39001 |
已经存在通讯了 |
|
39003 |
初始化WSAS失败 |
|
39010 |
端口参数错误 |
|
39012 |
创建通讯对象失败 |
|
39013 |
通讯对象不存在 |
|
39015 |
参数指针为空 |
|
39016 |
分配内存失败 |
|
39020 |
同步发送:等待返回超时 |
|
39022 |
同步发送:没有收到数据或者被拒绝 |
发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208890.html原文链接:https://javaforall.net
