SECS/GEM Driver开发使用,带例子

SECS/GEM Driver开发使用,带例子SECSDriver 软件 demo 界面包含一些 SxFy 的示例 里面包含代码使用的样式 使用简洁清楚 用户一看就熟悉使用 稳定是该产品的重点 无论用户在什么场景下都能够保证稳定的运行 在功能保证的前提下 7 24 小时稳定运行是基础 下载地址 www secsgem cn4 代码截图代码部分 新方法发送 voidCSecsExa OnBnClickedB S5F1

  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 R int 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("a"); 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; // 方法2 MESSGE_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 // 
    
    // 
      
    // 
      
    // > 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 
    ) 
    ; 
    } 
   

在这里插入图片描述

  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等待接收超时、重试连接等。

代码文件

依赖库DLL

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

CNetInteface项目

2.2.2 添加CNetInteface.Dll

  1. 将生成的CNetInteface.Dll添加到项目当中
  1. Active主动模式:
    主动连接到对方

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

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

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是发送给对方的数据

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是对方答复的数据
  1. nTransaction该参数在OnMsgHandle的消息通知里面含有。
  2. pData是答复对方的数据
  1. nSize参数为list的个数。如:上边的个数为2。
  1. pData为ASCII字符串。ASCII字符可参考相关标准。
  1. pData为二进制数据。
  1. pData为布尔数据。
  2. [] pData为多个布尔数据,基本用不到该函数。
  1. 添加整形数据
  2. [] pData为多个整形数据,基本用不到该函数。
  1. 添加整形数据
  2. [] pData为多个整形数据,基本用不到该函数。
  1. 添加浮点数据
  2. [] pData为多个数据,基本用不到该函数。
  1. 添加浮点数据
  2. [] pData为多个数据,基本用不到该函数。
  1. 返回值为true代表以及读取(提取)完SECS数据
  1. nType为数据的类型
  2. nSize为数据的个数
  3. pData为数据对象,需要转换成对象数据个数

4.4 接口使用和顺序

  1. 创建JngSecsEx对象
  2. 添加处理回调函数
    pMsgHandle
    pStateChangeHandle




  3. 开始通讯:StartSecs
  4. 等待pStateChangeHandle反馈SECS_STATE.eSecsStateEnsureComm通讯建立成功
  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);










    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);










头文件依赖库

#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; }; 
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/208866.html原文链接:https://javaforall.net

(0)
上一篇 2026年3月19日 上午10:35
下一篇 2026年3月19日 上午10:36


相关推荐

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号