SET SNB 是工业自动化中 “写入编号参数” 的核心操作,与 GET NSN 形成 “读 - 写” 闭环,共同服务于生产追溯、设备通信和数据管理。其实现通常基于状态机逻辑,包含命令接收、请求发送、响应处理和错误控制等阶段,确保编号设置的可靠性和可追溯性
一、功能块实例化
二、功能块变量声明
*IN variables*)
(*---------------------------------------------*)
VAR_INPUT
ptIN_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_OUTPUT
bOut_ACK :BOOL;
bOut_NAK :BOOL;
END_VAR
(*---------------------------------------------*)
(*Local variables*)
(*---------------------------------------------*)
VAR
iStep,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_OUT
END_VAR
VAR CONSTANT
tTimeout :TIME:=t#30s ;
END_VAR
三、功能块 代码
(* Timer *)
IF iStep <> iStepOld THEN
iStepold := istep;
fbiTonTimeinStep(IN:= FALSE, PT:= t#1h, Q=> , ET=> tTimeinStep);
ELSE
fbiTonTimeinStep(IN:= TRUE, PT:= t#1h, Q=> , ET=> tTimeinStep);
END_IF
CASE iStep OF
0:(*clear function's return value*)
bOut_ACK := FALSE;
bOut_NAK := FALSE;
iStep := iStep+1;
1:(* wait for command *)
IF bIn_SendCMD THEN
ptIN_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 THEN
IF sSerialNumber <> ptIN_STATION_ITAC^.MMC_Comm.SET_SNB.sSerialNumberRecv THEN
bmerker := 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;
ELSE
bOut_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.bError := 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.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_IF
3: (*END*)
IF NOT bIn_SendCMD THEN
iStep:= 0;
END_IF
ELSE
iStep := 3;
END_CASE;
四、功能块代码说明
1、计时器与状态管理
IF iStep <> iStepOld THEN
iStepold := iStep;
fbiTonTimeinStep(IN:= FALSE, PT:= t#1h, Q=> , ET=> tTimeinStep); // 状态切换时重置计时器
ELSE
fbiTonTimeinStep(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 THEN
bOut_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);
ELSE
bOut_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