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添加到项目中

3 使用SECS库

代码

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using 金南瓜;namespace SecsExampleJngCNet
{public partial class MainForm : Form{JngSecsEx m_pSecs = new JngSecsEx();delegate void SetConnectState(SECS_STATE nState);delegate void SetShowMsg(string pText);SetConnectState m_pConnectState;SetShowMsg m_pMsgShow;OnAsyncMsgTimeoutHandle m_pAsyncMsgTimeoutHandle;public MainForm(){InitializeComponent();m_pConnectState = SetState;m_pMsgShow = ShowMsg; m_pAsyncMsgTimeoutHandle = AsyncMsgTimeoutProc;}private void buttonStart_Click(object sender, EventArgs e){JS_SETTING setting;setting.nDeviceID = StringToNum.atoi(textDeviceID.Text);setting.nPort = StringToNum.atoi(textPort.Text);setting.nConnectMode = (checkPassive.Checked == true ? 1 : 0);setting.pIP = textIP.Text;setting.nT3 = 5000;setting.nT5 = 5000;setting.nT6 = 5000;setting.nT7 = 5000;setting.nT8 = 5000;m_pSecs.pMsgHandle = OnMyMsgProc;m_pSecs.pStateChangeHandle = OnMyStateProc;m_pSecs.pAsyncMsgTimeoutHandle = OnAsyncMsgTimeoutProc;if (m_pSecs.StartSecs(setting) == 0){ShowMsg("开始通讯");}}private void button1_Click(object sender, EventArgs e){int nTransaction = 0;JngDataEx pData = new JngDataEx();string x = "122323";pData.AddAscii(x.ToCharArray());m_pSecs.SendAsyncData(1, 1, true, ref nTransaction, pData);ShowMsg("\r\n异步消息ID:" + nTransaction.ToString() + "发送完成");ShowSML(1, 1, pData, true);}private void button2_Click(object sender, EventArgs e){int nTransaction = 0;JngDataEx pData = new JngDataEx();pData.AddList(0);ShowSML(1, 13, pData, true);m_pSecs.SendAsyncData(1, 13, true, ref nTransaction, pData);}private void buttonS2F25_Click(object sender, EventArgs e){//          byte [] pByte = new byte[3];//          pByte[0] = 0x12;//          pByte[1] = 0xF2;//          pByte[2] = 0x1D;////          double [] dbF = new double[2];//          dbF[0] = 5.22;//          dbF[1] = -63.4;////          int[] dbI = new int[2];//          dbI[0] = 5;//          dbI[1] = 630120124;////          JngDataEx pData = new JngDataEx();//          pData.AddList(5);//          pData.AddBool(true);//          pData.AddBinary(pByte);//          pData.AddDouble(dbF);//          pData.AddAscii("1234");//          pData.AddInt(dbI);int nTransaction = 0;double[] dbF = new double[1];dbF[0] = 5.22;JngDataEx pData = new JngDataEx();pData.AddDouble(dbF);m_pSecs.SendAsyncData(2, 25, true, ref nTransaction, pData);ShowMsg("\r\n异步消息ID:" + nTransaction.ToString() + "发送完成");ShowSML(2, 25, pData, true);}// 响应数据回调public void OnMyStateProc(SECS_STATE nState, object pClientData){BeginInvoke(m_pConnectState, nState);}void SetState(SECS_STATE nState){switch (nState){case SECS_STATE.eSecsStateListen: textBoxSecsState.Text = "等待连接"; break;case SECS_STATE.eSecsStateConnect: textBoxSecsState.Text = "建立连接"; break;case SECS_STATE.eSecsStateDisconnect: textBoxSecsState.Text = "断开连接"; break;case SECS_STATE.eSecsStateEnsureComm: textBoxSecsState.Text = "已建立通讯"; break;}ShowMsg( textBoxSecsState.Text + "\r\n");}// 异步消息等待接收超时public void OnAsyncMsgTimeoutProc(int nTransfer, object pClientData){BeginInvoke(m_pAsyncMsgTimeoutHandle, nTransfer, pClientData);}void AsyncMsgTimeoutProc(int nTransfer, object pClientData){ShowMsg("\r\n异步消息ID:" + nTransfer.ToString() + "超时");}string AppendIndent(long myIndentLevel){string pTmp = "";for (int i = 0; i < myIndentLevel; i++){pTmp += "  ";}return pTmp;}// 更新到界面   void ShowMsg(string pText){                    textBoxrecv.Text += pText;textBoxrecv.Select(textBoxrecv.TextLength, 0);//光标定位到文本最后textBoxrecv.ScrollToCaret();//滚动到光标处}// 响应还在void OnHere(MESSGE_PARAM pPaeam){JngDataEx pData = new JngDataEx();pData.AddList(0);           m_pSecs.SendReplyMessage(1, 2, pPaeam.nTransaction, ref pData);}// 响应数据回调public void OnMyMsgProc(MESSGE_PARAM pPaeam, JngDataEx pData, object pClientData){int nStream = pPaeam.nStream;int nFunction = pPaeam.nFunction;if (nStream == 1 && nFunction == 1){OnHere(pPaeam);}else if (pPaeam.nStream == 1 && pPaeam.nFunction == 13){OnCommS1F13(pPaeam.nTransaction);}    ShowSML(nStream, nFunction, pData);}public void ShowSML(int nStream, int nFunction, JngDataEx pData, bool bSend = false){SECS_TYPE nType = SECS_TYPE._ERR_TYPE;int nSize = 0;//// 显示数据            string pTmpData = "";long[] myStack = new long[128];long myStackPtr = 0;string pBegin;        // 前面添加的对象string pEnd;// 一个整体数据string pAllInfo;if (bSend){pAllInfo = "\r\n发送数据:";}else{pAllInfo = "\r\n收到数据:";}pAllInfo += "S";pAllInfo += nStream.ToString();pAllInfo += "F"; pAllInfo += nFunction.ToString();// 循环提取数据pData.MoveHead();while (true){object pItemData = null;int nCode = pData.GetNextData(ref nType, ref nSize, ref pItemData);if (nCode != 0){string pErrTmp = "数据有误,错误代码:" + nCode.ToString();break;}else{// 对方发送的数据没有错误if (pData.DataIsEnd()){break;// 数据提取完成}else{// 字符控制pBegin = "";pEnd = "";if (myStackPtr > 0){if (myStack[myStackPtr - 1] > 0){myStack[myStackPtr - 1]--;pBegin = AppendIndent(myStackPtr);}else{myStackPtr--;myStack[myStackPtr - 1]--;pBegin = AppendIndent(myStackPtr);pEnd = ">\r\n";}}switch (nType){case SECS_TYPE._LIST:{pTmpData = "<L[" + nSize.ToString() + "]";myStack[myStackPtr] = nSize;myStackPtr++;}break;case SECS_TYPE._BINARY:{pTmpData = "<B[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += Convert.ToString(((byte[])pItemData)[i], 16).ToUpper();//    Convert.ToString(tData[intIndex], 16).ToUpper()}}break;case SECS_TYPE._BOOLEAN:{pTmpData = "<BOOL[" + nSize.ToString() + "] ";bool[] buff = (bool[])pItemData;for (int i = 0; i < buff.Length; i++){pTmpData += " ";pTmpData += (buff[i] ? "1" : "0");}}break;case SECS_TYPE._ASCII:{pTmpData = "<A[" + nSize.ToString() + "] ";char [] buff = (char [])pItemData;for (int i = 0; i < buff.Length; i++){pTmpData += buff[i];}                                  }break;case SECS_TYPE._U1:{pTmpData = "<U1[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((byte[])pItemData)[i].ToString();}}break;case SECS_TYPE._U2:{pTmpData = "<U2[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((UInt16[])pItemData)[i].ToString();}}break;case SECS_TYPE._U4:{pTmpData = "<U4[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((UInt32[])pItemData)[i].ToString();}}break;case SECS_TYPE._I1:{                                    pTmpData = "<I1[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";int nTmp = ((Int32[])pItemData)[i];pTmpData += nTmp.ToString();}}break;case SECS_TYPE._I2:{pTmpData = "<I2[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((Int16[])pItemData)[i].ToString();}}break;case SECS_TYPE._I4:{pTmpData = "<I4[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((Int32[])pItemData)[i].ToString();}}break;case SECS_TYPE._F4:{pTmpData = "<F4[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((float[])pItemData)[i].ToString();}}break;case SECS_TYPE._F8:{pTmpData = "<F8[" + nSize.ToString() + "]";for (int i = 0; i < nSize; i++){pTmpData += " ";pTmpData += ((double[])pItemData)[i].ToString();}}break;}}}pTmpData = pBegin + pTmpData;pTmpData += pEnd;pTmpData = "\r\n" + pTmpData;// 添加数据pAllInfo += pTmpData;}pAllInfo += "\r\n.";// 更新到界面BeginInvoke(m_pMsgShow, pAllInfo);           }private void FormCloseing(object sender, FormClosingEventArgs e){}private void buttonClose_Click(object sender, EventArgs e){m_pSecs.StopSecs();}private void button3_Click(object sender, EventArgs e){           JngDataEx pData = new JngDataEx();pData.AddList(1);pData.AddAscii("1001");ShowSML(1, 3, pData);int nReplyStream = 0;int nReplyFunction = 0;JngDataEx pReplyData = null;long nCode = m_pSecs.SendSyncData(1, 3, true, pData,ref nReplyStream, ref nReplyFunction, ref pReplyData);if (nCode == 0){ShowSML(nReplyStream, nReplyFunction, pReplyData);}}void OnCommS1F13(int nTransaction){JngDataEx pData = new JngDataEx();byte[] pBinary = new byte[1];pBinary[0] = 0;// S1F13 R// <L[2]      //   <A[] "jin nan gua ke ji">//   <A[] "1.0.4">// >pData.AddList(2);pData.AddBinary(pBinary);pData.AddList(2);pData.AddAscii("jin nan gua ke ji");pData.AddAscii("1.0.4");ShowSML(1, 14, pData);m_pSecs.SendReplyMessage(1, 14, nTransaction, ref pData);}}
}

接口代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;///
// 广州金南瓜科技 SECS库
// 网站 http://www.semisecs.com
///namespace 金南瓜
{     // SECS 数据类public class JngDataEx{IntPtr m_pJsData;int m_nPos;bool m_bDataEnd;public JngDataEx(){m_nPos = 0;m_pJsData = JngHightSpeedSecsExport.JS_CreateDataObject();}~JngDataEx(){JngHightSpeedSecsExport.JS_DelereDataObject(m_pJsData);}// 添加单个指定数据public void AddList(int nSize){JngHightSpeedSecsExport.JS_DataItemAddList(m_pJsData, nSize);}// ASCII字符串public void AddAscii(string pData){IntPtr pAddr = Marshal.AllocHGlobal(pData.Length);try{byte[] pASCII = Encoding.ASCII.GetBytes(pData);Marshal.Copy(pASCII, 0, pAddr, pASCII.Length);JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, (Int32)pData.Length, SECS_TYPE._ASCII, pAddr);}catch{}Marshal.FreeHGlobal(pAddr);}// ASCII字符串public void AddAscii(char[] pData){IntPtr pAddr = Marshal.AllocHGlobal(pData.Length);try{byte[] pASCII = Encoding.ASCII.GetBytes(pData);Marshal.Copy(pASCII, 0, pAddr, pASCII.Length);JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, (Int32)pData.Length, SECS_TYPE._ASCII, pAddr);}catch{}Marshal.FreeHGlobal(pAddr);}// 二进制public void AddBinary(byte[] pData){IntPtr pAddr = Marshal.AllocHGlobal(pData.Length);try{Marshal.Copy(pData, 0, pAddr, pData.Length);JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, (Int32)pData.Length, SECS_TYPE._BINARY, pAddr);}catch{}Marshal.FreeHGlobal(pAddr);}// 布尔类型public void AddBool(bool pData){bool[] pTmp = new bool[1];pTmp[0] = pData;AddBool(pTmp);}// 布尔类型public void AddBool(bool[] pData){IntPtr pAddr = Marshal.AllocHGlobal(pData.Length);try{byte[] pTmp = new byte[pData.Length];for (int i = 0; i < pData.Length; i++){pTmp[i] = (Byte)(pData[i] ? 1 : 0);}Marshal.Copy(pTmp, 0, pAddr, pTmp.Length);JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, (Int32)pData.Length, SECS_TYPE._BOOLEAN, pAddr);}catch{}Marshal.FreeHGlobal(pAddr);}// 2字节整形public void AddInt(Int16 pData){Int16[] pList = new Int16[1];pList[0] = pData;AddInt(pList);}public void AddInt(Int16[] pData){JngHightSpeedSecsExport.JS_DataItemAddI2(m_pJsData, pData.Length, pData);}// 4字节整形public void AddInt(Int32 pData){Int32[] pList = new Int32[1];pList[0] = pData;AddInt(pList);}public void AddInt(Int32[] pData){JngHightSpeedSecsExport.JS_DataItemAddI4(m_pJsData, pData.Length, pData);}// 1字节无符号整形public void AddUInt(byte pData){byte[] pList = new byte[1];pList[0] = pData;AddUInt(pList);}public void AddUInt(byte[] pData){JngHightSpeedSecsExport.JS_DataItemAddU1(m_pJsData, pData.Length, pData);}// 2字节无符号整形public void AddUInt(UInt16 pData){UInt16[] pList = new UInt16[1];pList[0] = pData;AddUInt(pList);}public void AddUInt(UInt16[] pData){JngHightSpeedSecsExport.JS_DataItemAddU2(m_pJsData, pData.Length, pData);}// 4字节无符号整形public void AddUInt(UInt32 pData){UInt32[] pList = new UInt32[1];pList[0] = pData;AddUInt(pList);}public void AddUInt(UInt32[] pData){JngHightSpeedSecsExport.JS_DataItemAddU4(m_pJsData, pData.Length, pData);}// 浮点型public void AddFloat(float pData){float[] pList = new float[1];pList[0] = pData;AddFloat(pList);}public void AddFloat(float[] pData){int nSize = pData.Length * 4;IntPtr pAddr = Marshal.AllocHGlobal(nSize);try{Marshal.Copy(pData, 0, pAddr, pData.Length);JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, (Int32)pData.Length, SECS_TYPE._F4, pAddr);}catch{}Marshal.FreeHGlobal(pAddr);}// 添加浮点型public void AddDouble(double pData){double[] pList = new double[1];pList[0] = pData;AddDouble(pList);}public void AddDouble(double[] pData){int nSize = pData.Length * 8;IntPtr pAddr = Marshal.AllocHGlobal(nSize);try{Marshal.Copy(pData, 0, pAddr, pData.Length);JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, (Int32)pData.Length, SECS_TYPE._F8, pAddr);}catch{}Marshal.FreeHGlobal(pAddr);}//// 提取数据// 移动到数据开始public void MoveHead(){m_nPos = 0;m_bDataEnd = false;}// 数据是否已经读取完public bool DataIsEnd(){return m_bDataEnd;}// 下一个数据的长度、类型Int32 GetNextDataType(ref SECS_TYPE nType, ref Int32 nSize){nSize = 0;nType = SECS_TYPE._ERR_TYPE;IntPtr pData = IntPtr.Zero;Int32 nPos = m_nPos;return JngHightSpeedSecsExport.JS_DataItemGetNext(m_pJsData, ref nType, ref nSize,ref pData, ref nPos);}// 值public Int32 GetNextData(ref SECS_TYPE nType, ref Int32 nSize, ref object pData){Int32 nCode = 0;nSize = 0;nType = SECS_TYPE._ERR_TYPE;// 非托管IntPtr pBuffer = IntPtr.Zero;pData = null;try{// 获取数据int nPrePos = m_nPos;nCode = JngHightSpeedSecsExport.JS_DataItemGetNext(m_pJsData, ref nType, ref nSize, ref pBuffer, ref m_nPos);if (nCode == 0 ||nCode == (int)SECS_MODULE_CODE.CODE_SECS_NO_MORE_DATA){if (nPrePos == m_nPos){m_bDataEnd = true;nCode = 0;}if (pBuffer != IntPtr.Zero){pData = GetData(nType, ref nSize, pBuffer);}}}catch (System.Exception){}return nCode;}//// 内部使用接口// 内部使用接口public object GetData(SECS_TYPE nType, ref Int32 nSize, IntPtr pBuffer){object pObject = null;switch (nType){case SECS_TYPE._LIST: break;case SECS_TYPE._ASCII:{char[] pData = new char[nSize];for (int i = 0; i < nSize; i++){pData[i] = (char)Marshal.ReadByte(pBuffer, i);}pObject = pData;}break;case SECS_TYPE._BINARY:{byte[] pData = new byte[nSize];Marshal.Copy(pBuffer, pData, 0, nSize);pObject = pData;}break;case SECS_TYPE._BOOLEAN:{bool[] pData = new bool[nSize];for (int i = 0; i < nSize; i++){pData[i] = (Marshal.ReadByte(pBuffer, i) != 0);}pObject = pData;}break;case SECS_TYPE._I1:{Int32[] pData = new Int32[nSize];byte[] pTmpData = new byte[nSize];Marshal.Copy(pBuffer, pTmpData, 0, nSize);for (int i = 0; i < nSize; i++){UInt32 nTmpUx = (UInt32)pTmpData[i];if ((nTmpUx & 0x80) == 0x80){nTmpUx |= 0xFFFFFF00;}pData[i] = (Int32)nTmpUx;}pObject = pData;}break;case SECS_TYPE._I2:{Int16[] pData = new Int16[nSize];Marshal.Copy(pBuffer, pData, 0, nSize);pObject = pData;}break;case SECS_TYPE._I4:{Int32[] pData = new Int32[nSize];Marshal.Copy(pBuffer, pData, 0, nSize);pObject = pData;}break;case SECS_TYPE._U1:{byte[] pData = new byte[nSize];Marshal.Copy(pBuffer, pData, 0, nSize);pObject = pData;}break;case SECS_TYPE._U2:{UInt16[] pData = new UInt16[nSize];for (int i = 0; i < nSize; i++){pData[i] = (UInt16)Marshal.ReadInt16(pBuffer, i * 2);}pObject = pData;}break;case SECS_TYPE._U4:{UInt32[] pData = new UInt32[nSize];for (int i = 0; i < nSize; i++){pData[i] = (UInt32)Marshal.ReadInt32(pBuffer, i * 4);}pObject = pData;}break;case SECS_TYPE._F4:{float[] pData = new float[nSize];Marshal.Copy(pBuffer, pData, 0, nSize);pObject = pData;}break;case SECS_TYPE._F8:{double[] pData = new double[nSize];Marshal.Copy(pBuffer, pData, 0, nSize);pObject = pData;}break;}return pObject;}// 内部使用接口public JngDataEx(IntPtr pData){m_nPos = 0;m_pJsData = pData;}// 获取数据,内部函数public IntPtr GetData(){return m_pJsData;}// 设置数据,内部函数public void SetData(IntPtr pJsData){if (m_pJsData != IntPtr.Zero){JngHightSpeedSecsExport.JS_DelereDataObject(m_pJsData);}m_pJsData = pJsData;}public void AddItem(int nSize, SECS_TYPE nType, object pData){//           JngHightSpeedSecsExport.JS_DataItemAdd(m_pJsData, nSize, nType, ref pData);}}
}

SECS/GEM接口代码

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;///
// 广州金南瓜科技 SECS库
// 网站 http://www.semisecs.com
///namespace 金南瓜
{    // SECS 通讯操作类// 状态改变处理public delegate void OnStateChangeHandle(SECS_STATE nState, object pClientData);// 消息处理public delegate void OnMsgHandle(MESSGE_PARAM pPaeam, JngDataEx pData, object pClientData);// 异步消息等待接收超时public delegate void OnAsyncMsgTimeoutHandle(int nTransfer, object pClientData);// 连接处理public class JngSecsEx{public OnMsgHandle pMsgHandle = null;                           // 消息接收函数public OnStateChangeHandle pStateChangeHandle = null;           // 通讯状态改变函数public OnAsyncMsgTimeoutHandle pAsyncMsgTimeoutHandle = null;   // 异步消息等待接收超时public object m_pClient = null;                                 // 用于多线程关联的对象// 内部变量IntPtr m_pSecsComm;       Mutex m_syncLock = new Mutex();bool m_bStart = false;  // 是否开始了long m_nKey;     // 获取唯一keyOnMsgProc m_pOnMsgProc = null;OnStateChangeProc m_pOnStateChangeProc = null;OnAsyncMsgTimeoutProc m_pOnAsyncMsgTimeoutProc = null;public JngSecsEx(){m_pSecsComm = JngHightSpeedSecsExport.JS_CreateCommObject();m_pOnMsgProc = new OnMsgProc(OnMyMsgProc);m_pOnStateChangeProc = new OnStateChangeProc(OnStateChangeHandle);m_pOnAsyncMsgTimeoutProc = new OnAsyncMsgTimeoutProc(OnAsyncMsgTimeoutHandle);// 获取唯一key        m_nKey = MapManage.Instance().AddObject(this);}~JngSecsEx(){JngHightSpeedSecsExport.JS_SetCallback(m_pSecsComm, null, null, null, (IntPtr)0); JngHightSpeedSecsExport.JS_ReleaseCommObject(m_pSecsComm);MapManage.Instance().DeleteObject(m_nKey);}// 开始通讯public int StartSecs(JS_SETTING setting){int nCode = 0;m_syncLock.WaitOne();try{if (m_bStart == false){JngHightSpeedSecsExport.JS_SetCallback(m_pSecsComm, m_pOnMsgProc,m_pOnStateChangeProc, m_pOnAsyncMsgTimeoutProc, (IntPtr)m_nKey);nCode = JngHightSpeedSecsExport.JS_Start(m_pSecsComm, setting);m_bStart = true;}}catch (System.Exception){               }m_syncLock.ReleaseMutex();return nCode;}// 停止通讯public void StopSecs(){m_syncLock.WaitOne();try{// 锁JngHightSpeedSecsExport.JS_ReleaseCommObject(m_pSecsComm);m_pSecsComm = JngHightSpeedSecsExport.JS_CreateCommObject();m_bStart = false;}catch (System.Exception){}m_syncLock.ReleaseMutex();}/* 异步消息发送 */public int SendAsyncData(int nStream, int nFunction, bool bNeedReply, ref int nTransaction, JngDataEx pData = null){MESSGE_PARAM param = new MESSGE_PARAM();param.nStream = nStream;param.nFunction = nFunction;param.nNeedReply = bNeedReply ? 1 : 0;if (pData == null){pData = new JngDataEx();}int nCode = JngHightSpeedSecsExport.JS_SendAsyncMessage(m_pSecsComm, ref param, pData.GetData());nTransaction = param.nTransaction;return nCode;}/* 同步发送 */public int SendSyncData(int nStream, int nFunction, bool bNeedReply, JngDataEx pData,ref int nReplyStream, ref int nReplyFunction, ref JngDataEx pReplyData){int nTransaction = 0;int nReplyTransaction = 0;return SendSyncData(nStream, nFunction, bNeedReply, ref nTransaction, pData,ref nReplyStream, ref nReplyFunction, ref nReplyTransaction, ref pReplyData);}/* 同步发送 */public int SendSyncData(int nStream, int nFunction, bool bNeedReply, ref int nTransaction, JngDataEx pData,ref int nReplyStream, ref int nReplyFunction, ref int nReplyTransaction, ref JngDataEx pReplyData){MESSGE_PARAM param = new MESSGE_PARAM();param.nStream = nStream;param.nFunction = nFunction;param.nNeedReply = bNeedReply ? 1 : 0;// 答复数据MESSGE_PARAM replyParam = new MESSGE_PARAM();IntPtr pReplyPoint = new IntPtr();int nCode = JngHightSpeedSecsExport.JS_SendSyncMessage(m_pSecsComm, ref param, pData.GetData(), ref replyParam, ref pReplyPoint);nTransaction = param.nTransaction;// 返回值pReplyData = new JngDataEx(pReplyPoint);nReplyStream = replyParam.nStream;nReplyFunction = replyParam.nFunction;nReplyTransaction = replyParam.nTransaction;return nCode;}/* 答复消息发送 */public int SendReplyMessage(int nStream, int nFunction, int nTransaction, ref JngDataEx pData){MESSGE_PARAM param = new MESSGE_PARAM();param.nStream = nStream;param.nFunction = nFunction;param.nTransaction = nTransaction;return JngHightSpeedSecsExport.JS_SendReplyMessage(m_pSecsComm, param, pData.GetData());}/* 答复消息发送 */public int SendReplyMessage(int nStream, int nFunction, int nTransaction){JngDataEx pData = new JngDataEx();MESSGE_PARAM param = new MESSGE_PARAM();param.nStream = nStream;param.nFunction = nFunction;param.nTransaction = nTransaction;return JngHightSpeedSecsExport.JS_SendReplyMessage(m_pSecsComm, param, pData.GetData());}// 响应数据回调void OnMyMsgProc(IntPtr pComm, MESSGE_PARAM pPaeam, IntPtr pData, IntPtr pClientData){JngSecsEx pSecs = MapManage.Instance().GetObject((long)pClientData);if (pSecs != null) {try{if (pSecs.pMsgHandle != null){JngDataEx SecsData = new JngDataEx(pData);pSecs.pMsgHandle(pPaeam, SecsData, m_pClient);}}catch (Exception ){}}}// 响应状态回调void OnStateChangeHandle(IntPtr pComm, Int32 nState, IntPtr pClientData){JngSecsEx pSecs = MapManage.Instance().GetObject((long)pClientData);if (pSecs != null){try{if (pSecs.pStateChangeHandle != null){pSecs.pStateChangeHandle((SECS_STATE)nState, m_pClient);}}catch{}}}// 异步消息等待接收超时void OnAsyncMsgTimeoutHandle(IntPtr pComm, Int32 nTransfer, IntPtr pClientData){JngSecsEx pSecs = MapManage.Instance().GetObject((long)pClientData);if (pSecs != null){try{if (pSecs.pAsyncMsgTimeoutHandle != null){pSecs.pAsyncMsgTimeoutHandle(nTransfer, m_pClient);}}catch{}}}  }
}

代码 

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Runtime.InteropServices;

namespace 金南瓜
{
    // SECS的数据格式清单
    public enum SECS_TYPE
    { 
        _ERR_TYPE       = 0x00,
        _LIST            = 0x01,
        _BINARY            = 0x02,
        _BOOLEAN        = 0x03,
        _ASCII            = 0x04,
        _I1                = 0x10,                 /* C#没有8位的有符号整形,建立使用Int16、Int32代替 */
        _I2                = 0x11,
        _I4                = 0x12,
        _I8                = 0x13,
        _F8                = 0x20,
        _F4                = 0x21,
        _U1                = 0x30,
        _U2                = 0x31,
        _U4                = 0x32,
        _U8                = 0x33,
    }
        
    public enum SECS_MODULE_CODE
    {
        SUCC                         = 0,    /* 成功 */
        CODE_POINT_IS_NULL             = 100,    /* 指针地址为空 */
        CODE_SECS_DATA_ERROR         = 101,    /* SECS数据错误 */
        CODE_SECS_DATA_SIZE_ERROR     = 102,    /* SECS数据长度不匹配错误 */
        CODE_SECS_NO_MORE_DATA       = 103, /* 没有更多的数据了 */
    }

public enum SECS_STATE
    {
        eSecsStateDisconnect = 1,        // 断开连接
        eSecsStateListen = 2,            // 倾听、等待通讯
        eSecsStateConnect = 3,            // 建立连接成功
        eSecsStateEnsureComm = 4,        // 确认通讯成功
    };
     
    // 参数
    [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;                 // 设备ID
        [MarshalAs(UnmanagedType.ByValTStr, SizeConst = 24)]
        public string pIP;                        // a string IP "103.214.16.101"     
    };

// 发送消息数据
    [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;            
    };

// 托管也使用cdecl方式
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void OnMsgProc(IntPtr pComm, MESSGE_PARAM pPaeam, IntPtr pData, IntPtr pClientData);
    
    // 连接处理
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void OnStateChangeProc(IntPtr pComm, Int32 nState, IntPtr pClientData);

// 异步消息等待接收超时
    [UnmanagedFunctionPointer(CallingConvention.StdCall)]
    public delegate void OnAsyncMsgTimeoutProc(IntPtr pComm, Int32 nTransfer, IntPtr pClientData);

class JngHightSpeedSecsExport
    {
         
        /* 创建通讯对象 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public IntPtr JS_CreateCommObject();
        
        /* 断开一个连接(如果需要断开连接)和释放资源 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_ReleaseCommObject(IntPtr pHandle);

/* 开始通讯 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_Start(IntPtr pHandle, JS_SETTING setting);

/* 回调函数,通讯之前设置 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_SetCallback(IntPtr pHandle, OnMsgProc pMsgProc,
            OnStateChangeProc pStateChangeProc, OnAsyncMsgTimeoutProc pAsyncMsgTimeoutProc, IntPtr pClient);

// 数据发送

/* 异步消息发送 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_SendAsyncMessage(IntPtr pHandle, ref MESSGE_PARAM param, IntPtr pData);

/* 同步消息发送, 返回数据需要JS_DelereObject释放 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_SendSyncMessage(IntPtr pHandle, ref MESSGE_PARAM param, IntPtr pData, ref MESSGE_PARAM replyParam, ref IntPtr pReplyData);
          
        /* 答复消息发送 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_SendReplyMessage(IntPtr pHandle, MESSGE_PARAM param, IntPtr pData);

// 数据操作
        
        /* 创建顺序对象 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public IntPtr JS_CreateDataObject();

/* 删除顺序对象 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DelereDataObject(IntPtr pObject);
        
        /* 添加数据 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAdd(IntPtr pObject, Int32 nSize, SECS_TYPE nType, IntPtr pData);
       
        /* 获取数据 */
        [DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_DataItemGetNext(IntPtr pObject, ref SECS_TYPE nType,
            ref Int32 nSize, ref IntPtr pData, ref Int32 nPos);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public Int32 JS_DataItemGetNextData(IntPtr pObject, SECS_TYPE nType,
            Int32 nSize, IntPtr pData, ref Int32 nPos);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddList(IntPtr pObject, Int32 nSize);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddBriny(IntPtr pObject, Int32 nSize, ref byte[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddBool(IntPtr pObject, Int32 nSize, ref bool[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddAscii(IntPtr pObject, Int32 nSize, ref string pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddI1(IntPtr pObject, Int32 nSize, ref byte[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddI2(IntPtr pObject, Int32 nSize, Int16[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddI4(IntPtr pObject, Int32 nSize, Int32[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddI8(IntPtr pObject, Int32 nSize, ref Int64[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddU1(IntPtr pObject, Int32 nSize, byte[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddU2(IntPtr pObject, Int32 nSize, UInt16[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddU4(IntPtr pObject, Int32 nSize, UInt32[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddU8(IntPtr pObject, Int32 nSize, ref UInt64[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddDouble4(IntPtr pObject, Int32 nSize, ref float[] pData);

[DllImport("JngHightSpeedSecs", CallingConvention = CallingConvention.StdCall)]
        extern static public void JS_DataItemAddDouble8(IntPtr pObject, Int32 nSize, ref double[] pData);
   
    
    
    
    
    
    }

}

SECS/GEM之SECS Driver开发源代码相关推荐

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

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

  2. HSMS/SECS/GEM/GEM300半导体通讯协议介绍

    HSMS/SECS/GEM/GEM300半导体通讯协议解决方案介绍 目录 SECS/GEM协议通讯 1 目录 2 1.介绍 3 1.1 产品概述 3 1.1.1 高扩展性 4 1.2 通讯实现 4 1 ...

  3. SECS/GEM:PLC与MES间处理

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

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

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

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

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

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

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

  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 ...

最新文章

  1. 如何在浏览器上跑深度学习模型?并且一行JS代码都不用写
  2. 飞机是由塑料杆的飞鸽传书
  3. dataframe scala 修改值_【Spark学习笔记】 Scala DataFrame操作大全
  4. RCON 服务器命令协议
  5. linux系统如何管理文件
  6. Centos7安装RocketMQ及配置测试
  7. Spark-TaskSchedule和TaskScheduleImpl解释和过程
  8. java 排队实现_java中的优先列队-PriorityQueue源码实现解析
  9. 微信3D小游戏已达数百款,这里肯定有你没玩过的小游戏!
  10. python雷达图的相似度_Python可视化:matplotlib 制作雷达图进行对比分析
  11. 峰瑞资本李丰:共享经济如何改造专业且非标准化的服务业
  12. EMV Level1(7816)学习(Smart Cart智能卡)-2
  13. STM32MP157 Linux系统移植开发篇19:Linux内核Wi-Fi驱动移植
  14. 机器学习:考试预测实战(特征隐射,独热编码,特征重要性选择,网格搜索调参)
  15. 三菱FX系列PLC以太网连接昆仑通态MCGS
  16. 我的对象Girl会分身,浅克隆、深克隆
  17. TI深度学习(TIDL)--2
  18. iOS Camera照相机
  19. Python课程第二章实例训练
  20. 完全免费的OCR文字识别软件

热门文章

  1. 重装战姬怎么用电脑玩 重装战姬模拟器玩法教程
  2. 芯片之家——为开源而生
  3. Linux虚拟机网络设置
  4. 美的合肥荆州工厂均入选全球“灯塔工厂”;美国运通新版百夫长白金、黑金人民币卡将上市 | 美通企业日报...
  5. 【黑金动力社区】【原创博文集锦】《液晶驱动与GUI 基础教程》导读
  6. PDF在线阅览FlexPaper正版授权无品牌
  7. 【35】WEB安全学习----XST攻击
  8. 江苏省的计算机二级考试c语言
  9. IDEA向前向后箭头,左右箭头如何设置
  10. python装饰器哪个好_[Python] 对 Python 装饰器的理解心得