1. SECS Driver软件demo界面
    包含一些SxFy的示例,里面包含代码使用的样式。
    使用简洁清楚,用户一看就熟悉使用。

  2. 稳定是该产品的重点,无论用户在什么场景下都能够保证稳定的运行,在功能保证的前提下,7*24小时稳定运行是基础。

    下载地址 www.secsgem.cn


4. 代码部分


// 新方法发送
void CSecsExampleJngDlg::OnBnClickedButtonS5f1New()
{CSecsList pList;CSecsBinary pALCD(1);CSecsAscii pALID("1000");CSecsAscii pALTX("Fire Alarm");pList.AddItem(pALCD);pList.AddItem(pALID);pList.AddItem(pALTX);// 发送数据long nTransaction = 0;m_JngSecs.AsyncSend(5, 1, true, nTransaction, pList);}

显示当前的状态代码


void CSecsExampleJngDlg::OnStateChangeHandle(int nState)
{if(!IsWindow(m_hWnd)){return;}string pAllInfo;switch (nState){case eSecsStateDisconnect:   pAllInfo = " 断开连接";      break;case eSecsStateListen:        pAllInfo = " 倾听";            break;case eSecsStateConnect:       pAllInfo = " 建立连接";      break;case eSecsStateEnsureComm:    pAllInfo = " 通讯";            break;}pAllInfo += "\r\n";CString pText;m_editMsg.GetWindowText(pText);pText += pAllInfo.c_str();m_editMsg.SetWindowText(pText);}

S2F25示例代码

void CSecsExampleJngDlg::OnBnClickedButtonS2f25()
{// S2F25 Rint nStream = 0;int nFunc = 0;CJsData pData, pReply;// 封装数据char pBList[5] = {0x10, 0x22, 0x33, 0x44, 0x55};pData.AddList(3);pData.AddBinary(5, pBList);pData.AddAscii("1023456a");pData.AddList(6);pData.AddAscii("10qwq6a");pData.AddAscii("102wq 3456a");pData.AddDouble(5.22);pData.AddInt(512);pData.AddInt((__int16)512);pData.AddUint((unsigned __int16)512);ShowData(2, 25, &pData); long nCode = m_JngSecs.SyncSend(2, 25, true, pData, nStream, nFunc, pReply);// 提取数据if(nCode == 0){int nType;int nSize;char* pTmp = NULL;nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);// 没有更多的数据了nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);nCode = pReply.GetNextData(nType, nSize, (void**)&pTmp);ShowData(nStream, nFunc, &pReply);}nFunc = 0;return;// 方法2MESSGE_PARAM pParam;pParam.nStream = 2;pParam.nFunction = 25;pParam.nNeedReply = 1;MESSGE_PARAM pReplyParam;nCode = m_JngSecs.SyncSend(pParam, pData, pReplyParam, pReply);}

通讯的示例


void CSecsExampleJngDlg::OnCommS1F13(int nTransaction)
{CJsData pData;// S1F13 R// <L[2]        //   <A[] "jin nan gua ke ji">//   <A[] "1.0.4">// >pData.AddList(2);pData.AddBinary(0);pData.AddList(2);pData.AddAscii("jin nan gua ke ji");pData.AddAscii("1.0.4");ShowData(1, 14, &pData);m_JngSecs.ReplySend(1, 14, nTransaction, pData);}

SECS Driver使用说明书
金南瓜科技有限公司

1 简介

  1. Secs Driver 由金南瓜科技提供,适用于半导体、光伏、面板、PCB等行业
    支持C、C++、C#等编程语言(C#对应C#DLL库)

  2. SECS Driver集成E5,E37的功能。支持主动或者被动模式通讯,实时接收数据和反馈通讯状态给上层应用。

  3. 用户可以按照客户的要求(Space)或自己的需求,进行设计SECS编码。SECS Driver提供编辑SECS编码的接口。

  4. 接口使用简单,支持多线异步调用,无需用户考虑多线程问题。SECS Driver支持用户多线程交互使用。

  5. 金南瓜已经集成HSMS的功能处理,超时处理、Message等待接收超时、重试连接等。

2 使用
2.1 C/C++版本
2.1.1 导入资料
将以下文件添加到项目当中
–> JngHightSpeedSecsExport.h
–> JngSecsEx.h
–> JngSecsEx.cpp

代码文件

依赖库DLL

依赖Lib

2.1.2 添加依赖项
依赖性如下图
JngHightSpeedSecs.lib

2.1.3 添加文件到项目
将.h和.cpp添加到项目中

2.2 C#版本
2.2.1 生成CNetInteface

  1. 用户将C#编译CNetInteface成自己所用的.net平台,例如net4.5,net4.6

CNetInteface项目

2.2.2 添加CNetInteface.Dll

  1. 将生成的CNetInteface.Dll添加到项目当中

3 SECS、HSMS 简介
3.1 SECS 超时定义
Timeout Value Range Resolution Typical Value Description
T3 1-120 seconds 1 seconds 45 seconds Reply timeout. Specifies maximum amount of time an entity expecting a reply message shall wait for that reply.
消息答复超时。
T5 1-240 seconds 1 seconds 10 seconds Connection Separation Timeout. Specifies the amount of time which must elapse between successive attempts to connect to a given remote entity.
连接失败重试时间。
T6 1-240 seconds 1 seconds 5 seconds Control Transaction Timeout. Specifies the time which a control transaction may remain open before it is considered a communications failure.
控制交换超时。
T7 1-240 seconds 1 seconds 10 seconds Time which a TCP/IP connection can remain in NOT SELECTED state (i.e., no HSMS activity) before it is considered a communications failure.
No Select选择超时
T8 1-120 seconds 1 seconds 5 seconds Maximum time between successive bytes of a single HSMS message which may expire before it is considered a communications failure.

3.2 连接模式
HSMS通讯有俩种通讯模式

  1. Active主动模式:
    主动连接到对方

  2. Passive被动模式:
    被动等待对方连接过来。

3.3 TCP/IP参数
参数分别是TCP/IP地址和TCP/IP端口号。

3.4 DeviceID设备ID
DeviceID也称为Session ID(会话ID)。
需要双方的DeviceID一致才能进行会话。

4. C# API接口简介
4.1 C# JngSecsEx通讯接口类
该类为SECS通讯对象
4.1.1 StartSecs 开始通讯
int StartSecs(JS_SETTING setting)

  1. 通知Driver开始通讯
  2. 附带参数JS_SETTING包含超时、IP、端口号等

4.1.2 StopSecs停止通讯
public void StopSecs()

  1. 通知Driver停止通讯

4.1.3 SendAsyncData 发送异步数据
该函数发送消息成功后,函数立马返回。

int SendAsyncData(int nStream, int nFunction, bool bNeedReply, ref int nTransaction, JngDataEx pData = null)

  1. 接收答复的消息需要通过注册OnMsgHandle pMsgHandle响应函数。
  2. nTransaction是消息唯一ID。通过该ID可以与接收的数据关联。
  3. bNeedReply设置是否需要对方答复该消息。
  4. pData是发送给对方的数据

4.1.4 SendSyncData 发送同步数据
该函数发送消息成功后,函数会等待对方答复消息或者等待超时后才返回。

int SendSyncData(int nStream, int nFunction, bool bNeedReply, JngDataEx pData, ref int nReplyStream, ref int nReplyFunction, ref JngDataEx pReplyData)

  1. bNeedReply设置是否需要对方答复该消息。
  2. nReplyStream是对方答复的Stream
  3. nReplyFunction是对方答复的Function
  4. pReplyData是对方答复的数据

4.1.5 SendReplyMessage 答复函数
该函数用于答复对方主动发送过来的数据。
int SendReplyMessage(int nStream, int nFunction, int nTransaction, ref JngDataEx pData)

  1. nTransaction该参数在OnMsgHandle的消息通知里面含有。
  2. pData是答复对方的数据

4.2 C# JngDataEx数据处理类
JngDataEx用于构建和解析SECS消息

4.2.1 创建一个数据对象
JngDataEx pObject = new JngDataEx();
该对象管理SECS格式的消息数据。

4.2.2 AddList 添加SECS list数据
void AddList(int nSize)
如下边SECS消息的L类型
L,2

  1. nSize参数为list的个数。如:上边的个数为2。

4.2.3 AddAscii添加ASCII字符串
public void AddAscii(string pData)
void AddAscii(char[] pData)
添加字符串到数据当中

  1. pData为ASCII字符串。ASCII字符可参考相关标准。

4.2.4 AddBinary添加二进制数据
void AddBinary(byte[] pData)
添加二进制数据到数据当中

  1. pData为二进制数据。

4.2.5 AddBool添加布尔数据
void AddBool(bool pData)
void AddBool(bool[] pData)
布尔数据未true和false

  1. pData为布尔数据。
  2. [] pData为多个布尔数据,基本用不到该函数。

4.2.6 AddInt添加整数数据
void AddInt(Int16 pData)
void AddInt(Int16[] pData)
void AddInt(Int32 pData)
void AddInt(Int32[] pData)

  1. 添加整形数据
  2. [] pData为多个整形数据,基本用不到该函数。

4.2.7 AddUInt添加无符号整数数据
void AddUInt (byte pData)
void AddUInt (byte[] pData)
void AddUInt (Int16 pData)
void AddUInt (Int16[] pData)
void AddUInt (Int32 pData)
void AddUInt (Int32[] pData)

  1. 添加整形数据
  2. [] pData为多个整形数据,基本用不到该函数。

4.2.8 AddFloat添加浮点型数据
void AddFloat (float pData)
void AddFloat (float[] pData)

  1. 添加浮点数据
  2. [] pData为多个数据,基本用不到该函数。

4.2.9 AddDouble添加浮点型数据
void AddDouble (double pData)
void AddDouble (double[] pData)

  1. 添加浮点数据
  2. [] pData为多个数据,基本用不到该函数。

4.2.10 MoveHead数据移动到开始位置
void MoveHead()
用于读取数据,从头开始读取SECS数据。

4.2.11 DataIsEnd判断数据是否读完全部
bool DataIsEnd()
用于读取数据,判断是否读取完

  1. 返回值为true代表以及读取(提取)完SECS数据

4.2.12 GetNextDataType获取下一个数据的信息
Int32 GetNextDataType(ref SECS_TYPE nType, ref Int32 nSize)
用于读取数据,获取下一个数据的长度、类型

4.2.13 GetNextData获取下一个数据的值
Int32 GetNextData(ref SECS_TYPE nType, ref Int32 nSize, ref object pData)
用于读取数据,获取数据类型、长度、值

  1. nType为数据的类型
  2. nSize为数据的个数
  3. pData为数据对象,需要转换成对象数据个数

4.3相关参数资料
4.3.1 SECS数据类型清单
public enum SECS_TYPE
{
_ERR_TYPE = 0x00,
_LIST = 0x01,
_BINARY = 0x02,
_BOOLEAN = 0x03,
_ASCII = 0x04,
_I1 = 0x10,
_I2 = 0x11,
_I4 = 0x12,
_I8 = 0x13,
_F8 = 0x20,
_F4 = 0x21,
_U1 = 0x30,
_U2 = 0x31,
_U4 = 0x32,
_U8 = 0x33,
}
4.3.2 错误代码
public enum SECS_MODULE_CODE
{
SUCC,
CODE_POINT_IS_NULL,
CODE_SECS_DATA_ERROR,
CODE_SECS_DATA_SIZE_ERROR,
CODE_SECS_NO_MORE_DATA,
}

4.3.3 通讯状态
public enum SECS_STATE
{
eSecsStateDisconnect,
eSecsStateListen,
eSecsStateConnect,
eSecsStateEnsureComm,
};

4.3.4 SECS通讯参数
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct JS_SETTING
{
public Int32 nT3; // Reply timeout
public Int32 nT5; // Connect separation timeout
public Int32 nT6; // Control transaction timeout
public Int32 nT7; // Not selected timeout
public Int32 nT8; // Network intercharacter timeout
public Int32 nConnectMode; // 1=Passive, 0=Active
public Int32 nPort;
public Int32 nDeviceID;
[MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)]
public string pIP; // a string IP “103.214.16.101”
};

4.3.4 数据信息
[StructLayout(LayoutKind.Sequential, Pack = 1)]
public struct MESSGE_PARAM
{
public Int32 nStream;
public Int32 nFunction;
public Int32 nNeedReply; // 0:不需要答复, 1:需要答复
public Int32 nTransaction; // 主动发送时候为空
[MarshalAs(UnmanagedType.ByValArray, SizeConst = 10)]
public Byte[] pHeader;
};

4.4 接口使用和顺序

  1. 创建JngSecsEx对象
  2. 添加处理回调函数
    pMsgHandle
    pStateChangeHandle
  3. 开始通讯:StartSecs
  4. 等待pStateChangeHandle反馈SECS_STATE.eSecsStateEnsureComm通讯建立成功
  5. 开始SECS的消息交互

5 使用SECS库
使用顺序

  1. 创建通讯对象

  2. 初始化参数

  3. 开始通讯

  4. 收发数据
    5.1 创建SECS对象
    CJngSecsEx m_JngSecs; // 金南瓜的SECS
    5.2 设置通讯参数及建立通讯

  5. 设置处理回调函数
    m_JngSecs.SetCallback(::MsgCallback, ::OnStateChange, this);

    1. 设置参数并且开始通讯
      JS_SETTING setting;
      setting.nConnectMode = m_bPassive?1:0;
      setting.nDeviceID = 0;
      setting.nPort = m_nPort;
      strncpy_s(setting.pIP, m_pIP, 24);

    setting.nT3 = 5000;
    setting.nT5 = 5000;
    setting.nT6 = 5000;
    setting.nT7 = 5000;

    m_JngSecs.StartSecs(setting);

5.3 构建SECS数据

  1. 创建数据对象
    CJsData pData;

  2. 添加SECS数据
    pData.AddList(4);
    pData.AddAscii(“jin nan gua ke ji”);
    pData.AddAscii(“1.0.4”);
    pData.AddDouble(5.22);
    pData.AddInt(512);

5.4 发送SECS数据
返回值为发送结果
long nCode = m_JngSecs.AsyncSend(2, 25, true, nTransaction, pData);

或者
long nCode = m_JngSecs.SyncSend(2, 25, true, nTransaction, pData, nStream, nFunc, nReplyTransaction, pReply);

头文件依赖库

#pragma once
#include "JngHightSpeedSecsExport.h"#pragma comment (lib, "JngHightSpeedSecs")///
// 广州金南瓜科技 SECS库
// 网站 http://www.semisecs.com
///class CJsData;// 回调函数
typedef void (OnMsgProcEx) (MESSGE_PARAM pPaeam, CJsData* pData, void* pClient);        // 消息到来
typedef void (OnStateChangeProcEx) (SECS_STATE nState, void *pClientData);              // 通讯状态改变
// OnMsgProcEx 回调函数属于线程安全对象,可以阻塞处理事务
// OnStateChangeProcEx 回调函数不可阻塞处理事务// 数据处理对象
class CJsData
{public:CJsData();CJsData(const CJsData& pJsData);virtual ~CJsData();CJsData& operator = (const CJsData& dst);void AddItem(int nType, int nSize, void* pData);// 数据提取void MoveHead();int GetNextData(int& nType, int& nSize, void** pData);bool DataIsEnd();// 添加单个指定数据void AddList(int nSize); void AddAscii(char* pData);void AddAscii(int nSize, char* pData);void AddBinary(char pData);void AddBinary(int nSize, char* pData);void AddBool(bool pData);void AddInt(char pData);void AddInt(short pData);void AddInt(__int32 pData);void AddInt(__int64 pData);void AddUint(unsigned char pData);void AddUint(unsigned short pData);void AddUint(unsigned __int32 pData);void AddUint(unsigned __int64 pData);void AddFolat(float pData);void AddDouble(double pData);public:// 内部函数// 请勿使用以下函数JS_MSG_DATA GetData();                   // 获取数据void SetData(JS_MSG_DATA pData);     // 设置数据private:JS_MSG_DATA m_pJsData;int m_nPos;bool m_bDataEnd;};// 通讯对象
// 支持多线程调用
class CJngSecsEx
{public:CJngSecsEx();virtual ~CJngSecsEx();int StartSecs(JS_SETTING setting);        // 开始运行SECS,启用通讯void StopSecs();                     // 停止运行SECS// 数据发送int AsyncSend(MESSGE_PARAM& pParam, CJsData& pData);      // 异步发送数据int AsyncSend(int nStream, int nFunction, bool bNeedReply, long& nTransaction, CJsData& pData);        // 异步发送数据int SyncSend(MESSGE_PARAM& pParam, CJsData& pData, MESSGE_PARAM& pReplyParam, CJsData& pReplyData);    // 同步发送数据int SyncSend(int nStream, int nFunction, bool bNeedReply, CJsData& pData, int& nRelpyStream, int& nRelpyFunction, CJsData& pReplyData);            // 同步发送数据int SyncSend(int nStream, int nFunction, bool bNeedReply, long& nTransaction, CJsData& pData, int& nRelpyStream, int& nRelpyFunction, long& nRelpyTransaction, CJsData& pReplyData);           // 同步发送数据int ReplySend(int nStream, int nFunction, int nTransaction, CJsData& pData);       // 发送答复数据// 回调设置void SetCallback(OnMsgProcEx pProc, OnStateChangeProcEx pState, void* pClient);     // 设置回调函数private:// 内部函数// 响应回调处理void OnMsgProcHandle(MESSGE_PARAM pPaeam, JS_MSG_DATA pData);void OnStateChangeHandle(int nState);// 消息到来static void __stdcall OnMsgProcImp (JS_COMM_OBJECT pComm, MESSGE_PARAM pPaeam, JS_MSG_DATA pData, void *pClientData);static void __stdcall OnStateChangeImp (__int32 nState, void *pClientData);private:// 内部数据JS_COMM_OBJECT m_pSecsComm;OnMsgProcEx* m_pMsgProc;OnStateChangeProcEx* m_pStateChangeProc;void* m_pClient;};

SECS/GEM Driver开发使用,带例子相关推荐

  1. SECS/HSMS Driver开发使用 支持E5、E37

    SECS Driver开发 1 简介 Secs Driver 由金南瓜科技提供,适用于半导体.光伏.面板.PCB等行业 支持C.C++.C#等编程语言(C#对应C#DLL库) SECS Driver集 ...

  2. SECS/GEM协议开发系列(二)与Host连接

    secs协议的连接,我们还是要先看协议栈,如下图所示: 从协议栈,我可以看到,连接方式有两种: 1,串口连接,对应的是secs i 协议.串口参数,串口号,波特率,数据位,停止位,校验位. 2,网口连 ...

  3. SECS/GEM:PLC与MES间解决方案

    SECS/GEM是由国际半导体设备连接性标准.此连接性标准用于在设备和工厂的资讯和控制系统间建立通讯.被定义为制造设备实现通讯和控制的一般模型.一般来说,SECS/GEM标准定义了信息.状态机和情境, ...

  4. SECS/GEM之SECS Driver开发源代码

    1 简介 1. Secs Driver 由金南瓜科技提供,适用于半导体.光伏.面板.PCB等行业 支持C.C++.C#等编程语言(C#对应C#DLL库) 2. SECS Driver集成E5,E37的 ...

  5. 半导体通讯标准EAP、SECS/GEM视频介绍

    GEM(或SECS / GEM)是由半导体设备材料倡议制定的一组连接标准.这些标准用于定义自动化设备与主机工厂网络之间的通信,从而实现智能工厂制造. SECS是半导体设备通信标准的首字母缩写.GEM是 ...

  6. EAP通讯基础之SECS/GEM/GEM300mm

    EAP系统用于控制半导体设备进行自动化生产.与MES系统整合,校验产品信息,自动做账,同时收集产品生产过程中的制程数据和设备参数数据,帮助提高半导体工厂的生产效率,避免人工操作失误,提高产品良率. 而 ...

  7. SECS/GEM EAP 设备自动化功能原理和设计方案

    半导体EAP(Equipment Automation Programming)实现了对生产线上机台的实时监控,是工厂自动化不可缺少的控制系统.EAP系统与FAB中的机台紧密相关,系统的设计与开发必须 ...

  8. SECS/GEM使用

    1. 介绍 金南瓜SECS是最适应于全自动智能设备的选择. DMS SECS具有怪兽级的强劲性能,全面升级的高适应性,易用友好的SECS工具,利于快速开发部署. 金南瓜SECS兼容运行在独自工控机,或 ...

  9. SECS/GEM 半导体设备通讯标准学习笔记

    1. SECS/GEM简介 SEMI:Semiconductor Equipment and Materials International 国际半导体设备与材料产业协会 SECS:Semicondu ...

  10. PLC SECS/GEM解决方案,设计与应用

    1 适用性 金南瓜SECS是最适应于全自动智能设备的选择. 适用行业:半导体.光伏.PCB等 全面支持E5.E30.E37.E40.E87.E90.E94.E116 PLC SECS/GEM具有怪兽级 ...

最新文章

  1. 第二十一课.GBDT
  2. 2021年的第一盆冷水:有人说别太把图神经网络当回事儿
  3. 语言在msin函数验证_R语言时间序列分析(七):模型准确度估计
  4. 转载:写给计算机专业的朋友们
  5. 人工智能抢80万工人的饭碗,真的会失业吗?但是有新的转机
  6. VC++分析数据包实现Telnet协议分析
  7. 宏BOOST_TEST_TRAIT_TRUE的用法实例
  8. linux防火墙阻断目的,基于Linux防火墙的内部邮件监控与阻断系统
  9. 巴斯光年探险阿里聚安全攻防挑战赛!决战12月28日!
  10. SpringBoot - yml与properties配置文件及bean赋值
  11. 硅谷再不是程序员们的梦想天堂了
  12. python_PDF合成软件_ZHOU125disorder_
  13. 面试官:前端布局了解嘛?我一下说了接近五十种布局方案,给面试官整不会了。
  14. python读取excel汉字转成拼音_python实现汉字转拼音和读写excel
  15. 选择粘贴性无html,office无法复制粘贴-Word把内容从一个文档选择性粘贴到另一个文档,具体操作方法...
  16. python三维方式显示灰度图像(已验证)
  17. 利用scrapy爬取新浪体育新闻的小例子
  18. 使用mysql.help_topic生成序列
  19. 8000字干货:那些很厉害的人是怎么构建知识体系的
  20. FPGA的学习:基于ROM的VGA图像显示(弹跳特效)

热门文章

  1. Visio绘制时间轴、日程安排图、时间进度图的方法
  2. python自动选课原理_python实现学生选课系统 面向对象的应用:
  3. vsm什么意思_价值流程图VSM浅析
  4. 简单差分运放公式推倒
  5. Git廖雪峰 常用命令总结
  6. phpQuery采集乱码问题解决方案
  7. JEECG代码生成器(GUI)的使用
  8. jmp怎么做合并的箱线图_基于JMP 15的箱线图(Box Plot)的着色
  9. 人人网是明文传输,所以只要抓包就能知道用户名和密码
  10. ViewHolder的使用