plc - 如何在 IEC61131-3 结构化文本(TwinCAT3)中每隔 N 秒调用一次函数?
问题描述
我想在代码中做什么?
我想创建一个由 4 种方法组成的功能块:start
, stop
, run
, calculate
. Start
方法将调用具有周期性调用方法run
的循环的方法。只有当方法被调用时,方法内的 while 循环才会结束。while
calculate
run
stop
我已经尝试过的:
- 当我调用它时,
object.start()
我希望它开始一个循环,只要我不调用该stop
方法。
timer(IN := triggerTimer, PT := T#0.1S);
trigger(CLK := timer.Q);
workingFlag := TRUE;
run();
- 循环将在
run
方法中。循环将包含一个以workingFlag
变量为条件的 while 循环。while 循环何时workingFlag
会True
不断触发一个计时器结构,该结构将每 0.1S 调用该calculate
方法。
WHILE workingFlag = TRUE DO
triggerTimer := TRUE; //Start timer
IF trigger.Q THEN //If timer expired execute code below ...
calculate();
triggerTimer := FALSE; //Reset the timer
END_IF;
END_WHILE
- 最后,该
stop
方法将设置workingFlag
为False
,理论上它将结束run
方法中的循环。
workingFlag := FALSE;
问题是什么?
- 在我打电话后,
object.start()
我的整个 PC 崩溃了。因此......我认为我的代码出了点问题(:
我想用这个实现什么?
- 该对象将是一个 PID 控制器。而且我希望主要在我希望它进行调节以及需要它关闭时
program
调用该方法。start
stop
- 直到今天,我都在手动调用
calculate
主程序中的方法timer
,您可以在上面的方法中找到该run
方法。 - 我对这种方法的问题是,当我有更多的 PID(或我需要定期调用的其他函数)时,代码很快就会变得混乱。
- 因此,我想创建一个具有本地功能
timers
并自行管理定期调用的功能块。
那么请任何建议如何解决这个问题?
解决方案
它崩溃是因为您指示 PLC 永远运行 while 循环。PLC 软件已经循环运行(根据您的 PLCtask)。将 while 循环内的代码放入您在每个循环中调用的方法(或功能块的主体)中会更容易。
PLC 从上到下启动代码。然后 10 毫秒(或其他循环时间)后,它再次从上到下执行相同的代码。所以它本质上已经是一个很大的while循环了。在您的示例中运行 while 循环时,代码会进入 while 循环,但永远不会退出。然后某处的看门狗超时,TwinCAT 崩溃。
推荐阅读
- postgresql - Postgresql 使用全文 ts_query 精确匹配
- ios - 使用 inputAccessoryView 在 UICollectionViewController 上的零索引中插入项目时出现问题
- python - 试图让 has:permission 出错
- javascript - 如何隐藏/显示 C# 函数中的 html 元素?
- c# - DataGridTextColumn 中的 DataContext 绑定 ToolTipService.IsEnabled 错误
- r - 如何使用新数据自动更新闪亮的应用程序?
- gitlab - scp 在 Gitlab CI 作业期间找不到当前目录
- python - 在 Maya Python API 2.0 中连接数组属性
- angular - 父组件中的 Angular ActivatedRoute 参数订阅仅触发一次
- java - 将 Spring 升级到最新补丁版本是否安全?