GET NSN 是工业自动化和控制系统中用于 ** 获取序列号(Serial Number)** 相关信息的功能块。它通过通信协议(如 TCP/IP、OPC UA)与企业资源规划(ERP)、制造执行系统(MES)或仓储系统交互,获取物料、设备或产品的详细数据。
一、功能块实例化
二、功能块变量声明
(*IN variables*)
(*---------------------------------------------*)
VAR_INPUT
ptIN_STATION_ITAC :POINTER TO ST_ITAC_V2_0; (* Data for communication *)
uiAssignSNR :UINT ;
bIN_SendCMD :BOOL; (* Start send command. Wait for response *)
END_VAR
(*---------------------------------------------*)
(*OUT variables*)
(*---------------------------------------------*)
VAR_OUTPUT
bOUT_ACK :BOOL;
bOUT_NAK :BOOL;
sOUTSNRRecv :STRING[MAX_STRING_LENGTH];
END_VAR
(*---------------------------------------------*)
(*Local variables*)
(*---------------------------------------------*)
VAR
iStep,iStepOld :INT;
fbiTonTimeinStep : TON;
tTimeinStep : TIME;
itest: INT;
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;
sOUTSNRRecv :='';
iStep := 1;
1:(* wait for command *)
IF bIN_SendCMD THEN
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bError := FALSE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK := FALSE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecNAK := FALSE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText := '';
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sSNRREC := '';
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.uiAssignSNR := uiAssignSNR;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bSendRequest := TRUE;
iStep := iStep +1;
END_IF
2:(* wait for answer *)
IF ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK THEN
sOUTSNRRecv := ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sSNRREC;
bOUT_ACK := TRUE;
iStep:= iStep +1;
END_IF
IF ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecNAK THEN
bOUT_NAK := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bError := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText := '02| FB_SEQ_iTAC_GET_NSN -> NAK received ';
iStep:= iStep +1;
END_IF
IF tTimeinStep>tTimeout THEN
bOUT_NAK := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK := FALSE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecNAK := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bError := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText := '02| FB_SEQ_iTAC_GET_NSN -> timout ';
iStep:=iStep +1;
END_IF
3: (*END*)
IF NOT bIN_SendCMD THEN
iStep:= 0;
END_IF
ELSE
iStep :=0;
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; // 清除否定响应
sOUTSNRRecv := ''; // 清空接收的序列号
iStep := 1; // 切换到等待命令状态
- 功能:重置输出信号,为新的查询请求做准备。
2. 发送查询请求(iStep=1)
1: (* 等待发送命令 *)
IF bIN_SendCMD THEN // 检测到发送命令
// 重置通信模块状态
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bError := FALSE;
// ... 清除其他接收标志和错误信息
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.uiAssignSNR := uiAssignSNR; // 设置SNR分配模式
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bSendRequest := TRUE; // 触发NSN查询请求
iStep := iStep + 1; // 切换到等待响应状态
END_IF;
- 功能:
- 接收到查询命令后,清除历史错误标志。
- 通过
uiAssignSNR
参数配置查询模式(如按物料编号或序列号查询)。 - 向 MMC 系统发送 GET_NSN 请求。
3. 处理响应与错误(iStep=2)
2: (* 等待MMC响应 *)
IF ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecACK THEN // 收到确认响应
sOUTSNRRecv := ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sSNRREC; // 提取返回的序列号
bOUT_ACK := TRUE; // 标记请求成功
iStep := iStep + 1;
END_IF;
IF ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.bRecNAK THEN // 收到否定响应
bOUT_NAK := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText := '02| FB_SEQ_iTAC_GET_NSN -> NAK received ';
iStep := iStep + 1;
END_IF;
IF tTimeinStep > tTimeout THEN // 超时处理
bOUT_NAK := TRUE;
ptIN_STATION_ITAC^.MMC_Comm.GET_NSN.sErrText := '02| FB_SEQ_iTAC_GET_NSN -> timout ';
iStep := iStep + 1;
END_IF;
- 功能:
- ACK 响应:成功接收 NSN 数据,将序列号存入
sOUTSNRRecv
。 - NAK 响应:请求被拒绝,记录错误信息。
- 超时处理:通信无响应时触发错误,防止系统阻塞。
- ACK 响应:成功接收 NSN 数据,将序列号存入
4. 结束状态(iStep=3)
3: (* 结束状态 *)
IF NOT bIN_SendCMD THEN // 发送命令取消时
iStep := 0; // 回到初始化状态
END_IF;
- 功能:当不再有查询命令时,重置状态机,准备处理下一次请求。
3、工业应用场景
- 物料追溯:通过 NSN 查询物料的供应商、批次、库存位置等信息。
- 生产配置:获取序列号对应的工艺参数(如加工步骤、质量标准)。
- 自动化仓储:与货架系统集成,自动定位 NSN 对应的物料存放位置。
4、与 SET SNR 的协同
- SET SNR:向 MMC 系统上报本地生成的序列号及生产数据。
- GET NSN:从 MMC 系统获取预定义的 NSN 或序列号关联的物料信息。
- 协同场景:生产线上通过 GET NSN 获取物料信息后,使用 SET SNR 上报加工结果,实现全流程追溯。
5、核心技术要点
- 通信可靠性:通过 ACK/NAK 响应和超时机制确保数据交互稳定。
- 参数配置:
uiAssignSNR
控制查询模式(如按序列号分配或按物料编号查询)。 - 数据流向:请求由本地系统发起,MMC 返回结构化的 NSN 数据(如
sSNRREC
)。
五、附录
1、功能块调用树
2、