第一章 产品简介
1. 产品介绍
金南瓜SECS/GEM是最适合全自动智能设备的选择。 DMS SECS/GEM怪兽级性能强,适应性高,易用友好的SECS工具有利于快速开发和部署。
金南瓜SECS/GEM独立工控机或与设备软件相结合,使用户能够灵活应对各种使用场景。
2. 软件清单及显示

所有软件目录清单
2.1软件清单
1
提供EquipViewApp.exe和HostViewApp.exe俩款demo对应的场景是设备端和主机端的模拟。
2.
提供EquipViewApp.exe、 PlcSecsControlView.exe和HostViewApp.exe软件,对应的场景是设备端,PLC连接器和主机EAP端模拟。
3.
额外提供EquipViewApp300.exe和HostViewApp300.exe测试软件,分别对应GEM模拟300设备端和主机端。
2.2 模拟软件展示
1. 设备端模拟软件EquipViewApp
4. SECS/GEM300模拟软件EquipViewApp300
5. 其他软件
- 后台服务流程JNG_Server.exe
2.3 介绍其他文件
- SecsConfig 文件夹中的主要文件
- 加密狗或加密狗可用于操作许可证licenses.ini方式授权
-
- 报警信息表(ALID)
- 设备常量表(ECID)
- 为设备常量表(CEID)
- 用户软件设备常量表(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工控机
接口:
第二章 软件使用
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 |