- SECS Driver软件demo界面
包含一些SxFy的示例,里面包含代码使用的样式。
使用简洁清楚,用户一看就熟悉使用。 - 稳定是该产品的重点,无论用户在什么场景下都能够保证稳定的运行,在功能保证的前提下,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
)
;
}

- Secs Driver 由金南瓜科技提供,适用于半导体、光伏、面板、PCB等行业
支持C、C++、C#等编程语言(C#对应C#DLL库)
- SECS Driver集成E5,E37的功能。支持主动或者被动模式通讯,实时接收数据和反馈通讯状态给上层应用。
- 用户可以按照客户的要求(Space)或自己的需求,进行设计SECS编码。SECS Driver提供编辑SECS编码的接口。
- 接口使用简单,支持多线异步调用,无需用户考虑多线程问题。SECS Driver支持用户多线程交互使用。
- 金南瓜已经集成HSMS的功能处理,超时处理、Message等待接收超时、重试连接等。
代码文件
依赖库DLL
- 用户将C#编译CNetInteface成自己所用的.net平台,例如net4.5,net4.6
CNetInteface项目
2.2.2 添加CNetInteface.Dll
- 将生成的CNetInteface.Dll添加到项目当中
- Active主动模式:
主动连接到对方
- Passive被动模式:
被动等待对方连接过来。
- 通知Driver开始通讯
- 附带参数JS_SETTING包含超时、IP、端口号等
- 通知Driver停止通讯
int SendAsyncData(int nStream, int nFunction, bool bNeedReply, ref int nTransaction, JngDataEx pData = null)
- 接收答复的消息需要通过注册OnMsgHandle pMsgHandle响应函数。
- nTransaction是消息唯一ID。通过该ID可以与接收的数据关联。
- bNeedReply设置是否需要对方答复该消息。
- pData是发送给对方的数据
int SendSyncData(int nStream, int nFunction, bool bNeedReply, JngDataEx pData, ref int nReplyStream, ref int nReplyFunction, ref JngDataEx pReplyData)
- bNeedReply设置是否需要对方答复该消息。
- nReplyStream是对方答复的Stream
- nReplyFunction是对方答复的Function
- pReplyData是对方答复的数据
- nTransaction该参数在OnMsgHandle的消息通知里面含有。
- pData是答复对方的数据
- nSize参数为list的个数。如:上边的个数为2。
- pData为ASCII字符串。ASCII字符可参考相关标准。
- pData为二进制数据。
- pData为布尔数据。
- [] pData为多个布尔数据,基本用不到该函数。
- 添加整形数据
- [] pData为多个整形数据,基本用不到该函数。
- 添加整形数据
- [] pData为多个整形数据,基本用不到该函数。
- 添加浮点数据
- [] pData为多个数据,基本用不到该函数。
- 添加浮点数据
- [] pData为多个数据,基本用不到该函数。
- 返回值为true代表以及读取(提取)完SECS数据
- nType为数据的类型
- nSize为数据的个数
- pData为数据对象,需要转换成对象数据个数
4.4 接口使用和顺序
- 创建JngSecsEx对象
- 添加处理回调函数
pMsgHandle
pStateChangeHandle - 开始通讯:StartSecs
- 等待pStateChangeHandle反馈SECS_STATE.eSecsStateEnsureComm通讯建立成功
- 开始SECS的消息交互
- 创建通讯对象
- 初始化参数
- 开始通讯
- 收发数据
5.1 创建SECS对象
CJngSecsEx m_JngSecs; // 金南瓜的SECS
5.2 设置通讯参数及建立通讯 - 设置处理回调函数
m_JngSecs.SetCallback(::MsgCallback, ::OnStateChange, this);- 设置参数并且开始通讯
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数据
- 创建数据对象
CJsData pData;
- 添加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
