当前位置: 首页 > news >正文

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;
  • 功能
    1. 接收到设置命令后,清除历史错误标志。
    2. 配置待设置的序列号、生产状态、层级等参数。
    3. 向 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;
  • 功能
    1. ACK 响应:验证返回的序列号与发送值是否一致,不一致则记录错误。
    2. NAK 响应:请求被拒绝时记录错误信息。
    3. 超时处理:通信无响应时触发错误,防止系统阻塞。
4. 结束状态(iStep=3)
3: (* 结束状态 *)IF NOT bIn_SendCMD THEN  // 发送命令取消时iStep := 0;          // 回到初始化状态END_IF;
  • 功能:当不再有设置命令时,重置状态机,准备处理下一次请求。

3、工业应用场景

  1. 批次管理:向 MMC 系统设置产品批次号,绑定生产数据(如生产日期、工艺参数)。
  2. 序列号分配:为新产品分配唯一序列号,用于追溯生产流程和质量数据。
  3. 产线状态同步:通过iState参数上报产线状态(如生产中、待机),与 MES 系统同步。

4、与 GET NSN/SET SNR 的协同

  • GET NSN:从 MMC 获取已有编号信息(如物料 NSN)。
  • SET SNR:向 MMC 上报本地生成的序列号。
  • SET SNB:设置序列号块或批次号,三者共同构成 “查询 - 生成 - 绑定” 的数据闭环,支持生产全流程追溯。

5、核心技术要点

  1. 数据验证:通过对比发送与接收的序列号,确保设置操作的准确性。
  2. 错误处理:包含响应验证、超时检测和错误日志记录,提升系统鲁棒性。
  3. 参数配置:支持设置生产状态、层级和序列号模式,适配不同生产场景。

五、附录

执行SET_SNB

http://www.xdnf.cn/news/932905.html

相关文章:

  • Pyppeteer企业级爬虫实战:从动态渲染到反反爬突破(2025终极指南)
  • Day 21
  • 华为OD机考-机房布局
  • LLMs基础学习(八)强化学习专题(1)
  • 用 Lazarus IDE 写一个邮件客户端软件,能收发邮件,编写邮件
  • Django知识-视图
  • Go语言--语法基础5--基本数据类型--输入输出(1)
  • 【Go语言基础【17】】切片:一种动态数组
  • 如何利用 OpenCV 进行实时图像处理与对象检测
  • LeetCode - 560. 和为 K 的子数组
  • 持续交付的进化:从DevOps到AI驱动的IT新动能
  • 博图 SCL 编程技巧:灵活实现上升沿与下降沿检测案例分享(上)
  • Bootstrap 5学习教程,从入门到精通,Bootstrap 5 图像形状(Image Shapes)语法知识点及案例代码(8)
  • 基于 Transformer robert的情感分类任务实践总结之三——FGM
  • 从代码学习深度强化学习 - 多臂老虎机 PyTorch版
  • 【深度学习|学习笔记】自监督学习(Self-Supervised Learning, SSL)在遥感领域中的典型应用案例及其在小样本学习中的作用,附代码。
  • LeetCode --- 452周赛
  • 高保真组件库:按钮
  • GitHub 趋势日报 (2025年06月07日)
  • Langgraph实战-自省式RAG: Self-RAG
  • 材料力学速通
  • 北京工作周期7,8,9,10
  • 【react实战】如何实现监听窗口大小变化
  • 2025HNCTF - Crypto
  • webstorm 配置Eslint
  • Springboot 基于MessageSource配置国际化
  • C#调用Rust动态链接库DLL的案例
  • ​RBAC(基于角色的访问控制)权限管理详解
  • 学习日记-day24-6.8
  • 鸿蒙API自翻译