SECS用途
MES是制造执行系统,也称为后台系统。SECS是通讯协议。为便于全球企业的MES后台实时地监控各个设备状态、收集设备生产过程中的实时数据、及远程控制设备等、方便企业管理层进行信息化管理和决策管理,国际半导体组织制定了统一的交换数据的SECS通讯协议,只要所有企业和设备商都遵守这个协议,就可以与任何一家支持SECS协议的系统对接。
设备供应商要做的事情
设备按实际情况,罗列出可供采集单项信息,分如下几大类:
- 状态信息——系统的状态量
- 数据变量——实时变化的数据量
- 设备常量信息——设备固定常量
- 报警信息——与设备安全、人身安全等相关的报警
另外由上面衍生出来的组信息有:
- 事件信息——特定事件触发的一组或多组数据项
- Trace信息——用户周期性上报一组或多组数据
报表信息——用于定义一组数据项目,用在事件或Trace上报信息。
所有的信息量,都赋予唯一的ID, 以ID值对应所有的单变量或组变量。设备与MES后台交换数据都以ID作为依据。这些信息变量组成一张以ID为主键的数据大表。
一般来说、设备软件与MES后台需要交换的数据量一般不超过150个,大型设备定义3000个变量做数据交换之用,已是行业天花板了。所以建议ID编号类型统一unsigned short即2Byte字节足够存储,
开发过程
在CSDN有个完整的C++版本的SECS SDK可以下载下来SECS SDK,可参照着里面的Demo编写。SDK的库已实现了标准协议400多个SnFn,小且全面,一个dll搞定,不依赖任何第三方库。而且每一个接口你都可以override重写,按照你自己的想法去实现,如果你不重写也有默认的标准协议的实现。不管是标准协议还是自定义的SnFn都有非常好的支持。
这里详细介绍一下怎么开发:
1、先把SDK中include的secs.h拷贝到你的工程,添加进去
2、把SDK中的secs.lib,根据你的版本情况,选择对应版本拷贝到你的工程里,然后在Linker选项中添加进去
3、把SDK中的secs.dll,拷贝到你的工程的exe所在目录下。记得一定要把INI目录一起拷贝过去。
4、打开你的主窗口类,在头部包含#include"secs.h”
5、然后在主窗口类头部,添加一个派生即可。下面以Eqp端的Passive为例:
补上派生,public CEquipmentTCP 并在构造函数实现处补上,
CEquipmentTCP(Passive)。即可
6、然后把如下部分拷贝到代码头文件
// -------------------------- 分割线 ----------------------------------
private:
// ------------ 以下这部分为 SECS 相关,可以整体复制到你自己项目里面使用 ---------------
// 同时将SDK中Demo示例中的这3个文件 secs_Standard.cpp,secs_UserDef.cpp,secs_Logs.cpp
// 可以直接剪切到你的工程里面使用
void InitSecs();
void UnInitSecs();
int S2F21(HSMSHeader *pHdr, HCOMM hComm);
int S2F41(HSMSHeader *pHdr, HCOMM hComm);
int S10F3(HSMSHeader *pHdr, HCOMM hComm);
//TRACE 消息
LRESULT OnS6f1TraceData(WPARAM w, LPARAM l);
//wParam = 1 报警触发,0=报警清除
//lParam = ALID 报警ID;
LRESULT OnAlarmReport(WPARAM w, LPARAM l);
private:
// ------ UserDefined ------
int SnFn_UserDef(HSMSHeader *pHdr, HCOMM hComm);
int S1F65(HSMSHeader *pHdr, HCOMM hComm);
int S1F69(HSMSHeader *pHdr, HCOMM hComm);
private:
int data_message_proc(HSMSHeader *pHdr, HCOMM hComm);
int Select_req_proc(HSMSHeader *pHdr, HCOMM hComm);
int Select_rsp_proc(HSMSHeader *pHdr, HCOMM hComm);
int Deselect_req_proc(HSMSHeader *pHdr, HCOMM hComm);
int Deselect_rsp_proc(HSMSHeader *pHdr, HCOMM hComm);
int Linktest_req_proc(HSMSHeader *pHdr, HCOMM hComm);
int Linktest_rsp_proc(HSMSHeader *pHdr, HCOMM hComm);
int Reject_req_proc(HSMSHeader *pHdr, HCOMM hComm);
int Separate_req_proc(HSMSHeader *pHdr, HCOMM hComm);
int Send(char *buf, int len, HCOMM hComm);
void RestartTrace();
// ------------ 以下这部分为 SECS 打印日志相关 ---------------
private:
void OpenLogFile();
void CloseLogFile();
void ParseToLogfile(HSMSHeader *pHdr);
void GenerateLogString(ItemData &item,int blanks);
void GenerateLogString(ListItemData* entry, eFormatCode fc, int Len,int blanks);
private:
CString m_SecsLogfile;
CStdioFile m_logfile;
bool m_logInit;
SYSTEMTIME m_stNow;
SYSTEMTIME m_stOld;
7、然后把SDK中的secs_Standard.cpp,secs_UserDef.cpp,secs_Logs.cpp 三个文件直接拷贝到你的工程里面,添加进去.这里不粘贴具体代码。SDK的Demo有具体代码。
8、然后把宏 #define CMainClassName CsXXXXDlg修改成你的主窗体类名即可。
9、在你的主窗口中::OnInitDialog()里面添加
InitSecs();
OpenLogFile();
并在OnClose()里面添加
UnInitSecs();
CloseLogFile();
在BEGIN_MESSAGE_MAP 与 END_MESSAGE_MAP() 消息映射端添加上
//两个SECS相关的消息 TRACE ,Alarm
ON_MESSAGE(WM_S6F1_TRACEDATA, &CMainClassName::OnS6f1TraceData)
ON_MESSAGE(WM_S5F1_ALARMREPORT, &CMainClassName::OnAlarmReport)
编译即可。
截止这里,你的工程就实现了SECS的支持了。
另外,我们软件上面还需要做些什么别的工作呢,还是有一点辅助性的界面要自己加的,根据实际需要来加即可,主要有下面这些。
一、设备软件提供:
- Online Local 和Online Remote 两种模式;
- 两种模式可以相互切换模式;
- 在Remote模式的时候,本地user不可控制;
- Local模式的时候,Host可以获取Data。
二、远程控制命令包含(这个咱们可以提供在收到远程发来的命令后调用现有的功能):
- Start
- Stop
- Pause
- Resume
- Abort
- 其它自定义命令
三、显示类(user阅读后需要确认回执,加工软件做个显示框和确认按钮)
- Message
- Information
- Indication
信息小于500个ASCII字符。调用一下SECS的接口获取内容并自动回复后台。
四、需提供的UI
a、界面上要实时显示通讯状态、控制状态、处理状态、….;
b、有通讯设置界面,包括如下设置参数(IP,GateWay,SubnetMask,DNS, Port)、DeviceID;
c、有超时设置界面,包括 T3,T5,T6,T7,T8….
d、包含回路测试;
当然这些根据你的设备软件场景需要,不做强制要求。
本教程系列文章连载,如果有什么疑问,可留言或站内消息。