1简介
该手册讲述
Demo 程序操作流程
官网 www.secsgem.cn
2软件
2.1软件清单
软件清单如下图
支持VC6
2.2
运行环境
硬件要求
CPU:双核2GHz及以上
内存:4GB及以上
系统:Window XP、Window 7、Window 10、Window Server 2008、WindowServer2012、WindowServer 2016
3.1设备端
1 将设备端运行起来
导入金南瓜科技接口
-
软件特点:
-
符合SEMI E5、E30、E37 的 SECS 通讯规范
-
提供高速 Transaction 的通讯能力,高性能多线程并发处理Transaction
-
提供 DLL 元件供程式设计者使用
-
快速 Encode 与 Decode Big Message
-
提供VC++、C#等程式语言,提供程式的.Sample Code让程式设计师参考
-
开发使用
2.1 添加模块
将项目中secs文件拷贝至自己的项目中,同时引入项目
\EquipViewApp\EquipViewApp\secs
|- Group.h
|- SecsBase.cpp
|- SecsBase.h
|- SecsEquip.cpp
|- SecsEquip.h
|- SecsPortExport.h
|- SecsPort.lib (x86/x64) 该lib放置在demo对应的版本中
2.2 运行环境
Demo对应版本的所有文件都需要拷贝到运行目录下
-
JngServer文件夹
-
SecsSystemConfig文件夹
-
ClientConnect.dll
-
ErrInfo.dll
-
SecsPort.dll
-
Common.dll
-
更新内容
a. 选择demo对应的版本,除了JngServer/SecsConfig文件夹不更新,其他内容全部需要替换
b.替换以下代码模块
\EquipViewApp\EquipViewApp\secs
|- Group.h
|- Group.cpp
|- SecsBase.cpp
|- SecsBase.h
|- SecsEquip.cpp
|- SecsEquip.h
|- SecsPortExport.h
|- SecsPort.lib (x86/x64) 该lib放置在demo对应的版本中 -
SECS初始化顺序
a. 调用Start进行初始化SDK
b. 设置IP、端口、LoadDataByCsvFile、加载各类配置等
c. CommEnable进行使能通讯
软件交互流程
6 软件交互流程
6.1 初始化SDK模块
初始化流程
6.2 SDK与设备之间交互
代码资料
变量示例界面
#pragma once
#include "afxcmn.h"
#include "afxwin.h"
// CVariableView 对话框
class CVariableView : public CMyDialogEx
{
DECLARE_DYNAMIC(CVariableView)
public:
CVariableView(CWnd* pParent = NULL); // 标准构造函数
virtual ~CVariableView();
// 对话框数据
enum { IDD = IDD_VARIABLE_VIEW };
protected:
virtual void DoDataExchange(CDataExchange* pDX); // DDX/DDV 支持
virtual BOOL OnInitDialog();
DECLARE_MESSAGE_MAP()
// 初始化界面
virtual void OnInitView();
public:
afx_msg void OnBtnSetValue();
afx_msg void OnBtnRefresh();
afx_msg void OnLvnItemchangedListVariable(NMHDR *pNMHDR, LRESULT *pResult);
public:
// 更新列表
void UpdateVariableList();
void DeleteAllItem();
void AddItemToCtrl(VARIABLE_DATA& var);
void InitCtrl();
void HandleResult(RcResult rc);
void SelVID(int ID);
void SortObject(vector<VARIABLE_DATA>& veVar);
private:
CMyListCtrlEx m_ctrlVariable;
int m_nSelID;
int m_nCurSel;
CMyEdit m_editID;
CMyEdit m_editName;
CMyEdit m_editValue;
CMyStatic m_static[16];
};
// ChildView/VariableView.cpp : 实现文件
//
#include "stdafx.h"
#include "ChildView/VariableView.h"
#include "afxdialogex.h"
#include "CallbackHandle/CallbackHandle.h"
// CVariableView 对话框
IMPLEMENT_DYNAMIC(CVariableView, CMyDialogEx)
CVariableView::CVariableView(CWnd* pParent /*=NULL*/)
: CMyDialogEx(CVariableView::IDD, pParent)
{
SetTitle("变量");
m_nSelID = 0;
m_nCurSel = -1;
}
CVariableView::~CVariableView()
{
}
void CVariableView::DoDataExchange(CDataExchange* pDX)
{
CMyDialogEx::DoDataExchange(pDX);
DDX_Control(pDX, IDC_LIST_VARIABLE, m_ctrlVariable);
DDX_Control(pDX, IDC_EDIT_ID, m_editID);
DDX_Control(pDX, IDC_EDIT_NAME, m_editName);
DDX_Control(pDX, IDC_EDIT_VALUE, m_editValue);
DDX_Control(pDX, IDC_STATIC_10, m_static[0]);
DDX_Control(pDX, IDC_STATIC_11, m_static[1]);
DDX_Control(pDX, IDC_STATIC_12, m_static[2]);
}
BEGIN_MESSAGE_MAP(CVariableView, CMyDialogEx)
ON_NOTIFY(LVN_ITEMCHANGED, IDC_LIST_VARIABLE, OnLvnItemchangedListVariable)
ON_BN_CLICKED(IDC_BTN_SET_VALUE, OnBtnSetValue)
ON_BN_CLICKED(IDC_BTN_UPDATE, OnBtnRefresh)
END_MESSAGE_MAP()
// CVariableView 消息处理程序
BOOL CVariableView::OnInitDialog()
{
CMyDialogEx::OnInitDialog();
InitCtrl();
return TRUE; // return TRUE unless you set the focus to a control
// 异常: OCX 属性页应返回 FALSE
}
void CVariableView::InitCtrl()
{
m_ctrlVariable.InsertColumn(0, "variable ID", 0, 120);
m_ctrlVariable.InsertColumn(1, "name", 0, 250);
m_ctrlVariable.InsertColumn(2, "value", 0, 330);
m_ctrlVariable.InsertColumn(3, "value type", 0, 50);
}
// 初始化界面
void CVariableView::OnInitView()
{
RcResult rc;
rc = m_pSecs->VariableAdd(1601, "ONE_TEST", "test one", "U4", "1", "um"); SHOW_MSG_RC(rc);
rc = m_pSecs->VariableAdd(1602, "ONE_TEST_L", "test one", "L", "L {A 3} {A 5} {U4 1}", "um"); SHOW_MSG_RC(rc);
UpdateVariableList();
}
void CVariableView::OnBtnSetValue()
{
CString tmp;
m_editValue.GetWindowText(tmp);
RcResult rc = m_pSecs->VariableSet(m_nSelID, (LPCSTR)tmp);
SHOW_MSG_RC(rc);
if(rc.rc == 0)
{
// set list value
m_ctrlVariable.SetItemText(m_nCurSel, 2, tmp);
}
}
void CVariableView::OnBtnRefresh()
{
int nCount = m_ctrlVariable.GetItemCount();
int nID;
string pValue;
for (int i = 0; i < nCount; i++)
{
CString pText = m_ctrlVariable.GetItemText(i, 0);
nID = ::atoi(pText);
RcResult rc = m_pSecs->VariableGet(nID, pValue);
m_ctrlVariable.SetItemText(i, 2, pValue.c_str());
}
}
// 选中ID
void CVariableView::SelVID(int ID)
{
CString tmp;
string pValue;
RcResult rc = m_pSecs->VariableGet(ID, pValue);
SHOW_MSG_RC(rc);
if(rc.rc == 0)
{
// set list value
m_ctrlVariable.SetItemText(m_nCurSel, 2, pValue.c_str());
// ID
tmp = m_ctrlVariable.GetItemText(m_nCurSel, 0);
m_editID.SetWindowText(tmp);
// name
tmp = m_ctrlVariable.GetItemText(m_nCurSel, 1);
m_editName.SetWindowText(tmp);
// value
m_editValue.SetWindowText(pValue.c_str());
}
}
// 更新列表
void CVariableView::UpdateVariableList()
{
vector<VARIABLE_DATA> vvs;
RcResult rc = m_pSecs->VariableListGet(vvs);
SHOW_MSG_RC(rc);
if(rc.rc == 0)
{
SortObject(vvs); // 排序
DeleteAllItem();
for(unsigned int i = 0; i < vvs.size(); i++)
{
AddItemToCtrl(vvs[i]);
}
}
}
// 排序
void CVariableView::SortObject(vector<VARIABLE_DATA>& veVar)
{
list<SORT_OBJECT> listSort;
list<SORT_OBJECT>::iterator listIte;
vector<VARIABLE_DATA> veTmp = veVar;
// 排序
for (unsigned int i = 0; i < veTmp.size(); i++)
{
SORT_OBJECT pObject;
pObject.nNum = ::atoi(veTmp[i].VID.c_str());
pObject.pObject = &veTmp[i];
for (listIte = listSort.begin(); listIte != listSort.end(); listIte++)
{
if (listIte->nNum > pObject.nNum)
{
break;
}
}
listSort.insert(listIte, pObject);
}
// 复制到原来的对象
veVar.clear();
for (listIte = listSort.begin(); listIte != listSort.end(); listIte++)
{
veVar.push_back(*(VARIABLE_DATA*)(listIte->pObject));
}
}
void CVariableView::DeleteAllItem()
{
m_ctrlVariable.DeleteAllItems();
}
void CVariableView::AddItemToCtrl(VARIABLE_DATA& var)
{
int nCount = m_ctrlVariable.GetItemCount();
m_ctrlVariable.InsertItem(nCount, var.VID.c_str());
m_ctrlVariable.SetItemText(nCount, 1, var.VarName.c_str());
m_ctrlVariable.SetItemText(nCount, 2, var.Value.c_str());
m_ctrlVariable.SetItemText(nCount, 3, var.Type.c_str());
}
void CVariableView::OnLvnItemchangedListVariable(NMHDR *pNMHDR, LRESULT *pResult)
{
LPNMLISTVIEW pNMLV = reinterpret_cast<LPNMLISTVIEW>(pNMHDR);
*pResult = 0;
if(pNMLV->uOldState != 0 //旧状态
&& pNMLV->uNewState == 0)
{
}
else //新状态 和 选择同样
{
m_nCurSel = pNMLV->iItem;
CString pText = m_ctrlVariable.GetItemText(m_nCurSel, 0);
m_nSelID = ::atol(pText);
SelVID(m_nSelID);
}
}
void CVariableView::HandleResult(RcResult rc)
{
if(rc.rc != 0)
{
MessageBox(rc.ToString().c_str());
}
}
