找答案的高端用户(找答案钻石及双钻级别的用户)将尽可能从此问题下的所有回
答中,为您推荐最佳答案。届时您可以根据推荐数采纳答案。
如果自提问时间起7天内您仍无法选出最佳答案,您可以选择“无满意答案”关闭此问题。
问题
取消精华
首页精华问答
取消推荐
高端用户推荐
申请置评
已申请置评
修改
修改标签
添加标签
官方认证
取消官方认证
修改标签
添加标签
转移分类
删除
{{itemCategory}}
手机扫码追踪该问题,
分享一下,更快有答案!
点击复制链接
核心问题分析:
LCCF_EnetScanner_DB 库默认工作模式是周期性数据交换(Cyclic Data Exchange)。但对于很多第三方设备,在开始周期性通讯之前,必须通过非周期性通讯(Acyclic Communication)进行一些必要的初始化配置,例如:
写入设备参数
设置工作模式
映射通讯区
触发特定操作
解决方案的核心思路是: 利用库本身提供的 MS_Config 和 MS_Data 管脚,在启动阶段切换到非周期性通讯模式,完成参数设置后,再切回周期性模式。
详细操作步骤
您需要在您的调用 LCCF_EnetScanner_DB 的块(通常是 MAIN 或一个专用的FC/FB)中,构建一套状态逻辑来控制模式的切换。
步骤一:定义状态机变量
首先,在您的数据块(如 DB_MainControl)中创建必要的控制变量:
pascal
// 在DB中定义
VAR
// 通讯状态机
eCommState : INT; // 例如:0=初始化, 1=发送配置, 2=等待配置完成, 3=切换到循环模式, 4=运行
// 配置触发标志
bStartConfig : BOOL;
// 超时监控
tConfigTimeout : TIME;
tonTimeout : TON;
// 连接 LCCF_EnetScanner_DB 的临时变量
bMS_Config_Enable : BOOL;
bMS_Data_Enable : BOOL;
iMS_Data_Slot : INT;
iMS_Data_Subslot : INT;
iMS_Data_Index : INT;
iMS_Data_Length : INT;
bMS_Data_Write : BOOL;
bMS_Data_Read : BOOL;
pMS_Data_Send : Pointer;
pMS_Data_Receive : Pointer;
END_VAR
步骤二:构建控制逻辑
然后,在您的程序中构建一个状态机,例如使用 CASE 语句:
pascal
CASE eCommState OF
0: // 状态0:初始化
// 复位所有标志位,准备开始配置
bStartConfig := FALSE;
bMS_Config_Enable := FALSE;
bMS_Data_Enable := FALSE;
tonTimeout(IN:=FALSE); // 复位定时器
eCommState := 1; // 转移到下一个状态
1: // 状态1:触发非周期性通讯(配置)
// 设置 MS_Data 参数,指向您要写入的配置数据
bMS_Data_Enable := TRUE;
bMS_Data_Write := TRUE; // 执行写入操作
iMS_Data_Slot := 1; // 目标设备的插槽号
iMS_Data_Subslot := 1; // 目标设备的子插槽号
iMS_Data_Index := 16#8000; // 参数索引(根据第三方设备手册)
iMS_Data_Length := SIZEOF(stConfigData); // 要写入的数据长度
pMS_Data_Send := ADR(stConfigData); // 指向包含配置数据的数据结构
// 启动配置命令
bStartConfig := TRUE;
tonTimeout(IN:=TRUE, PT:=tConfigTimeout); // 启动超时定时器
eCommState := 2; // 转移到等待状态
2: // 状态2:等待配置完成
IF NOT bStartConfig THEN
// 当 bStartConfig 被 LCCF 块复位,表示命令已接受
bMS_Data_Enable := FALSE; // 禁用 MS_Data,等待响应
tonTimeout(IN:=FALSE); // 可以复位或保持定时器以等待响应
END_IF;
// 检查 LCCF 块的输出状态
IF "LCCF_DB".MS_Data_Done THEN
// 非周期性通讯成功完成!
tonTimeout(IN:=FALSE);
eCommState := 3; // 转移到切换模式状态
ELSIF "LCCF_DB".MS_Data_Error THEN
// 处理错误:"LCCF_DB".MS_Data_ErrorBits 包含错误代码
tonTimeout(IN:=FALSE);
eCommState := 0; // 错误处理:可以重试或报错
ELSIF tonTimeout.Q THEN
// 处理超时
tonTimeout(IN:=FALSE);
eCommState := 0; // 超时处理:可以重试或报错
END_IF;
3: // 状态3:切换到周期性模式
// 此时配置已完成,确保 MS_Data 已禁用,然后启用周期性通讯
bMS_Data_Enable := FALSE;
bMS_Config_Enable := FALSE; // 确保 MS_Config 也禁用
// 触发 LCCF 块开始建立周期性通讯
// 这通常是通过设置 LCCF_DB.Connect = TRUE 来实现的
"LCCF_DB".Connect := TRUE;
eCommState := 4; // 进入运行状态
4: // 状态4:运行(周期性通讯)
// 正常运行时,监控 "LCCF_DB".Status 来检查连接状态
// 如果需要重新配置,可以将 eCommState 重置为 0 或 1
// 例如,在收到特定错误代码或操作员指令时
IF bReconfigureRequest THEN
"LCCF_DB".Connect := FALSE; // 先断开连接
eCommState := 0;
END_IF;
END_CASE;
步骤三:连接控制变量到 LCCF 块
在调用 LCCF_EnetScanner_DB 时,将状态机逻辑产生的变量连接到对应的管脚:
MS_Config := bMS_Config_Enable
MS_Data := bMS_Data_Enable
MS_Data_Slot := iMS_Data_Slot
MS_Data_Subslot := iMS_Data_Subslot
MS_Data_Index := iMS_Data_Index
... (其他 MS_Data_* 输入管脚依此类推)
同时,确保在状态机中监控 LCCF_EnetScanner_DB 的输出管脚,如 MS_Data_Done, MS_Data_Error, 和 MS_Data_ErrorBits。
关键注意事项
时序至关重要:非周期性通讯的启动(bStartConfig 上升沿)和 MS_Data_* 参数的设置必须同步。最好在同一个扫描周期内完成。
超时处理:必须为非周期性操作设置超时监控,防止因设备无响应而导致程序卡死。
数据一致性:确保 pMS_Data_Send 指向的数据区域在非周期性通讯期间不被修改。
错误处理:必须处理 MS_Data_Error 和超时情况,并设计重试机制或报警给操作员。
设备文档:非周期性通讯的 Index, Submodule 等参数必须严格按照第三方设备的GSDML文件或通讯手册来设置。
测试:先在小型环境中充分测试状态逻辑,确保模式切换能稳定工作。
希望可以帮到你,记得给个好评。。
等您来回答
换一换
{{item.CoinValue}}西币
{{item.VisitNum}}人想问
本版相关问题
换一换
专家置评
首次回答问题,获得
双倍西币积分!
立即成为技术知识分享的一员!
欢迎您访问支持中心!
丰富的视频,全方位的文档,大量的网友交流精华……
为了更好的完善这些内容,我们诚邀您在浏览结束后,花20秒左右的时间,完成一个用户在线调查!
感谢您的支持!

西门子商城