基于SECS协议开发的简明教程(1)

14 篇文章 5 订阅
9 篇文章 30 订阅

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、包含回路测试;
 

当然这些根据你的设备软件场景需要,不做强制要求。

本教程系列文章连载,如果有什么疑问,可留言或站内消息。

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 12
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

凌志辉

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值