BeckHoff_FB --> SET_SNB 功能块
SET SNB 是工业自动化中 “写入编号参数” 的核心操作,与 GET NSN 形成 “读 - 写” 闭环,共同服务于生产追溯、设备通信和数据管理。其实现通常基于状态机逻辑,包含命令接收、请求发送、响应处理和错误控制等阶段,确保编号设置的可靠性和可追溯性
一、功能块实例化
二、功能块变量声明
*IN variables*)
(*---------------------------------------------*)
VAR_INPUTptIN_STATION_ITAC :POINTER TO ST_ITAC_V2_0; (* Data for communication *)sSerialNumber :STRING[cSerialNumberLen];iState :INT := 0; (*default := 0*)uiLayer :UINT := 2;uiSerialNrMode :UINT;bIn_SendCMD :BOOL; (* Start send command. Wait for response *)
END_VAR(*---------------------------------------------*)
(*OUT variables*)
(*---------------------------------------------*)
VAR_OUTPUTbOut_ACK :BOOL;bOut_NAK :BOOL;
END_VAR(*---------------------------------------------*)
(*Local variables*)
(*---------------------------------------------*)
VARiStep,iStepOld :INT;fbiTonTimeinStep : TON;tTimeinStep : TIME;sArg1 :STRING[MAX_STRING_LENGTH];sArg2 :STRING[MAX_STRING_LENGTH];FormatString :FB_FormatString;bmerker: BOOL := FALSE;
END_VAR(*---------------------------------------------*)
(*IN/OUT variables*)
(*---------------------------------------------*)
VAR_IN_OUTEND_VARVAR CONSTANTtTimeout :TIME:=t#30s ;
END_VAR
三、功能块 代码
(* Timer *)
IF iStep <> iStepOld THENiStepold := istep;fbiTonTimeinStep(IN:= FALSE, PT:= t#1h, Q=> , ET=> tTimeinStep);
ELSEfbiTonTimeinStep(IN:= TRUE, PT:= t#1h, Q=> , ET=> tTimeinStep);
END_IFCASE iStep OF0:(*clear function's return value*)bOut_ACK := FALSE;bOut_NAK := FALSE;iStep := iStep+1;1:(* wait for command *)IF bIn_SendCMD THENptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError := FALSE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK := FALSE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK := FALSE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '';ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv := '';ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.iStateRecv := 0;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiLayerRecv := 0;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv := '';ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.iState := iState; (*'1'; (* Serial Production*)*)ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumber := sSerialNumber;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiLayer := uiLayer;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiSerialNrMode := uiSerialNrMode;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bSendRequest := TRUE;iStep := iStep+1;END_IF;2:(* wait for answer *)IF ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK THENIF sSerialNumber <> ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv THENbmerker := TRUE;sArg1 := ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv;sArg2 := sSerialNumber;FormatString( sFormat := '02| FB_SEQ_iTAC_SET_SNB Recieved SerialNumber [%s] is not matching with sent SerialNumber [%s]',arg1 := F_STRING (sArg1),arg2 := F_STRING (sArg2),sOut => ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText);bOut_NAK := TRUE;ELSEbOut_ACK := TRUE;END_IFiStep:= iStep +1;END_IFIF ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK THENbOut_NAK := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '02| FB_SEQ_iTAC_SET_SNB -> NAK received ';iStep:= iStep +1;END_IFIF tTimeinStep>tTimeout THENbOut_NAK := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK := FALSE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '02| FB_SEQ_iTAC_SET_SNB -> timout ';iStep:=iStep +1;END_IF3: (*END*)IF NOT bIn_SendCMD THENiStep:= 0;END_IFELSEiStep := 3;END_CASE;
四、功能块代码说明
1、计时器与状态管理
IF iStep <> iStepOld THENiStepold := iStep;fbiTonTimeinStep(IN:= FALSE, PT:= t#1h, Q=> , ET=> tTimeinStep); // 状态切换时重置计时器
ELSEfbiTonTimeinStep(IN:= TRUE, PT:= t#1h, Q=> , ET=> tTimeinStep); // 持续计时
END_IF;
- 功能:记录每个状态的持续时间,用于检测通信超时(如超过
tTimeout
则触发错误)。
2、状态机核心流程
1. 初始化状态(iStep=0)
0: (* 清除输出标志 *)bOut_ACK := FALSE; // 清除确认响应bOut_NAK := FALSE; // 清除否定响应iStep := iStep+1; // 切换到等待命令状态
- 功能:重置通信结果标志,为新的设置请求做准备。
2. 发送设置请求(iStep=1)
iecst
1: (* 等待发送命令 *)IF bIn_SendCMD THEN // 检测到发送命令// 重置通信模块状态ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bError := FALSE;// ... 清除其他接收标志和错误信息// 设置SET_SNB参数ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.iState := iState; // 生产状态(如1表示批量生产)ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumber := sSerialNumber; // 待设置的序列号ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiLayer := uiLayer; // 生产层级(如产线、工位)ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.uiSerialNrMode := uiSerialNrMode; // 序列号模式ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bSendRequest := TRUE; // 触发SET_SNB请求iStep := iStep + 1; // 切换到等待响应状态END_IF;
- 功能:
- 接收到设置命令后,清除历史错误标志。
- 配置待设置的序列号、生产状态、层级等参数。
- 向 MMC 系统发送 SET_SNB 请求,请求写入序列号信息。
3. 处理响应与错误(iStep=2)
2: (* 等待MMC响应 *)IF ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecACK THEN // 收到确认响应// 验证返回的序列号是否与发送值一致IF sSerialNumber <> ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv THENbOut_NAK := TRUE; // 序列号不匹配,返回错误// 格式化错误信息FormatString(sFormat := '02| FB_SEQ_iTAC_SET_SNB 接收序列号[%s]与发送值[%s]不匹配',arg1 := ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv,arg2 := sSerialNumber,sOut := ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText);ELSEbOut_ACK := TRUE; // 验证通过,返回成功END_IF;iStep := iStep + 1;END_IF;IF ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.bRecNAK THEN // 收到否定响应bOut_NAK := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '02| FB_SEQ_iTAC_SET_SNB -> NAK received ';iStep := iStep + 1;END_IF;IF tTimeinStep > tTimeout THEN // 超时处理bOut_NAK := TRUE;ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sErrText := '02| FB_SEQ_iTAC_SET_SNB -> timout ';iStep := iStep + 1;END_IF;
- 功能:
- ACK 响应:验证返回的序列号与发送值是否一致,不一致则记录错误。
- NAK 响应:请求被拒绝时记录错误信息。
- 超时处理:通信无响应时触发错误,防止系统阻塞。
4. 结束状态(iStep=3)
3: (* 结束状态 *)IF NOT bIn_SendCMD THEN // 发送命令取消时iStep := 0; // 回到初始化状态END_IF;
- 功能:当不再有设置命令时,重置状态机,准备处理下一次请求。
3、工业应用场景
- 批次管理:向 MMC 系统设置产品批次号,绑定生产数据(如生产日期、工艺参数)。
- 序列号分配:为新产品分配唯一序列号,用于追溯生产流程和质量数据。
- 产线状态同步:通过
iState
参数上报产线状态(如生产中、待机),与 MES 系统同步。
4、与 GET NSN/SET SNR 的协同
- GET NSN:从 MMC 获取已有编号信息(如物料 NSN)。
- SET SNR:向 MMC 上报本地生成的序列号。
- SET SNB:设置序列号块或批次号,三者共同构成 “查询 - 生成 - 绑定” 的数据闭环,支持生产全流程追溯。
5、核心技术要点
- 数据验证:通过对比发送与接收的序列号,确保设置操作的准确性。
- 错误处理:包含响应验证、超时检测和错误日志记录,提升系统鲁棒性。
- 参数配置:支持设置生产状态、层级和序列号模式,适配不同生产场景。
五、附录
执行SET_SNB