栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

SECS/GEM编程

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

SECS/GEM编程

金南瓜SECS/GEM SDK开发

广州金南瓜科技

1. 简介

该手册介绍SECS/GEM Demo代码阅读和测试,SECS/GEM代码的入口、控制、操作、回调响应等

      

2. C++ EquipViewApp

         以下介绍代码阅读和使用

软件目录清单

2.1 SECS/GEM初始化

SECS/GEM函数代码:

BOOL CEquipViewAppDlg::OnInitDialog()

{

         CMyDialogEx::OnInitDialog();

         // 设置此对话框的图标。当应用程序主窗口不是对话框时,框架将自动

         //  执行此操作

         SetIcon(m_hIcon, TRUE);                            // 设置大图标

         SetIcon(m_hIcon, FALSE);                  // 设置小图标

         SetName();      

         ShowWindow(SW_SHOWNOACTIVATE);

        

         SetNewCreateType(false);              // 设置参数:本类非new方式创建的

         // 初始化连接 SECS

         InitConnect();

         InitChildArea();

         AddView();

         InitTree();

         // 初始化子窗口

         InitCtrl();

         InitChildView();

        

         return TRUE;  // 除非将焦点设置到控件,否则返回 TRUE

}

讲解:

1. SECS/GEM代码的入口在窗口类CEquipViewAppDlg的OnInitDialog()函数中

2. 首先初始化SECS类的通讯: InitConnect();

2.1 SECS/GEM创建通讯对象

try

{

         m_pSecs = new CSecsEquip();

}

catch (...)

{

         m_pSecs = nullptr;

}

2.2 初始化SECS DLL模块

RcResult rc = m_pSecs->Start();

2.3 设置各项SECS/GEM的参数

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

// SECS/GEM设置回调

m_pSecs->SetClientData(this);

m_pSecs->m_pTerminalCallback = ::OnTerminalProc;

m_pSecs->m_pStateChangeCallback = ::OnStateChangeProc;

m_pSecs->m_pRemoteCallback = ::OnRemoteProc;

// 示例的回调       

m_pSecs->m_pConstantsChangeCallback = ::OnConstantChangeProc;

m_pSecs->m_pVarValueProc = ::OnVarValueProc;

m_pSecs->m_pConstantValueProc = ::OnVarValueProc;

m_pSecs->m_pPPNameListProc = ::OnPPNameListProc;

m_pSecs->m_pPPEventProc = ::OnSecsPPEventProc;

         rc = m_pSecs->SetControlMode((CONTROL_MODE)g_appdata.m_nControlMode);

         2.4 开始SECS/GEM的通讯

rc = m_pSecs->CommEnable();

2.2 Communication、Control状态获取改变

代码:

注册回调函数

m_pSecs->m_pStateChangeCallback = ::OnStateChangeProc;

处理代码

void OnStateChangeProc(CSecsEquip* pSH, const char* varname, int nState)

{

    CEquipViewAppDlg* pHV = (CEquipViewAppDlg* )pSH->GetClientData();

    if(pHV != nullptr)

    {                          

                  string pType = varname;

                  if(pType == "comm_state")

                  {

                                pHV->PostMsgToView("Connect", ON_COMM_CHANGE, eCommStateChange, nState);       

                                pHV->PostMsgToView("Event", ON_COMM_CHANGE, eCommStateChange, nState);

                                pHV->PostMsgToView("Variable", ON_COMM_CHANGE, eCommStateChange, nState);

                                pHV->SendMessage(ON_COMM_CHANGE, eCommStateChange, nState);

                  }

                  else if(pType == "control_state")

                  {

                                pHV->PostMsgToView("Connect", ON_CONTROL_CHANGE, eControlStateChange, nState);

                                pHV->SendMessage(ON_CONTROL_CHANGE, eControlStateChange, nState);

                  }

    }

}

讲解:

1. 何时调用:

当SECS/GEM的通讯状态、控制状态发生改变的时候,SDK将会调用该函数通知最新状态。

2. 关联行:

初始化的时候,把该函数添加到回调中。

m_pSecs->m_pStateChangeCallback = ::OnStateChangeProc;

3. PostMsgToView的作用

上边函数收到状态信息后,将该数据通知到各个窗口里面。

4. 所需工作

显示到主界面中,显示实时的SECS/GEM状态在设备软件上

2.3 远程控制接收

代码:

注册回调函数

m_pSecs->m_pRemoteCallback = ::OnRemoteProc;

处理代码

 LRESULT CAutoSimpleView::OnRemoteProc(WPARAM wp, LPARAM lp)

{

    REMOTE_DATA rd = *((REMOTE_DATA*)lp);

   

    if(rd.pRCMD == "PP-SELECT")

    {

                  const char* pRecipeName = rd.GetValue("RecipeName");

                  if (pRecipeName == nullptr)

                  {

                                // 找不到recipe名称参数

                                return ::eCOMMAND_PARAMETER_IS_INVALID;

                  }

                  // 调用切换recipe函数

                  // ChangeRecipe(pRecipeName)

                  // 发送切换完成事件

                  // 发送事件函数一般放在ChangeRecipe里面

                  m_pSecs->EventPos(ChangeRecipeStartedSimple);

                  SleepEx();

                  string pName = "Recipe:";   

                  pName += pRecipeName;

                  m_staticRecipe.SetWindowText(pName.c_str());

                  m_pSecs->EventPos(ChangeRecipeCompleteSimple);

                  //处理成功

                  return eCOMMAND_PERFORMED;

    }            

    return eCOMMAND_PERFORMED;

}

讲解:

1. 何时调用:

当SECS/GEM收到远程命令时候,SDK将会调用该函数通知设备处理。

2. 关联行:

初始化的时候,把该函数添加到回调中。

m_pSecs->m_pRemoteCallback = ::OnRemoteProc;

3. PostMsgToView的作用

上边函数收到状态信息后,将该数据通知到各个窗口里面。

4. SECS/GEM所需工作

根据处理远程指令,设备做出对应的处理。

2.4 变量更新

代码:

2.5 警报发送

1. 找到下边的界面,双击界面的Set或Clear按钮,进入代码

2. 警报发生的时候,只需将“警报ID”和“true状态”发送。

3. 警报清除后,只需将“警报ID”和“false状态”发送。

2.6 事件发送

1. 找到下边的界面,双击界面的“发送事件”按钮,进入代码

2. 事件发生的时候,只需发送对应的事件ID

3. C#版本 Equip C# 3.1 初始化

函数代码:

// SECS

        void InitSecs(string IP, long nPort, bool bPassive, int nDeviceID)

        {

            RcResult rc = m_pSecs.start();

            if (rc.rc != 0)

            {

                MessageBox.Show("连接SECS错误:" + rc.ToString());

            }

            m_pSecs.SetIP(IP);

            m_pSecs.SetPort((int)nPort);

            m_pSecs.SetPassive(bPassive);

            m_pSecs.SetDeviceID(nDeviceID);

            m_pSecs.LoadDataByCsvFile();

            m_pSecs.SetRecipeDirectory("D://");

            m_pSecs.SetEnableLog(true);

                       

            m_pSecs.SetControlMode(CONTROL_MODE.eCONTROL_MODE_OFFLINE);

            m_pSecs.SetWinrarPath("C:/Program Files/WinRAR/WinRAR.exe");

            // 回调、委托

            m_pSecs.m_pOnCommState = OnCommStateEventHandler;

            m_pSecs.m_pOnControlState = OnControlStateEventHandler;

            m_pSecs.m_pOnRemoteCommand = OnRemoteCommandEventHandler;

            m_pSecs.m_pVarValueCallback = OnVariableValueHandler;

            m_pSecs.m_pOnTerminal = OnTerminalEventHandler;

            m_pSecs.m_pPPChangeNotifyProc = OnPPChangeNotifyEvent;

           // m_pSecs.m_pOnClock 该函数已经内置设置

                   

        }

讲解:

代码在SecsAppView.cs中,该类是窗口对象

3.2 Communication、Control状态获取改变

        

注册委托函数:

m_pSecs.m_pOnCommState = OnCommStateEventHandler;

m_pSecs.m_pOnControlState = OnControlStateEventHandler;

代码:

将状态显示到界面上

// 状态

        [Description("控制状态改变")]

        void OnCommStateEventHandler(object sender, CommStateEventArgs e)

        {

            BeginInvoke(m_commState, sender, e);

        }

        void OnCommStateEventShow(object sender, CommStateEventArgs e)

        {

            labelCommState.Text = CSecsAssist.GetCommunicationText(e.nState);

        }

        [Description("通讯状态改变")]

        void OnControlStateEventHandler(object sender, ControlStateEventArgs e)

        {

            BeginInvoke(m_controlState, sender, e);

        }

        void OnControlStateEventShow(object sender, ControlStateEventArgs e)

        {

            labelControlState.Text = CSecsAssist.GetControlText(e.nState);

        }

转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/993661.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号