4

我需要将一些现有的 C 代码移植到符合IEC 61131-3的PLC。

我有一些将代码拆分为离散功能块并将这些块编织成标准解决方案(梯形图、FB、结构化文本等)的选项。但这需要分割 C 代码以构建每个功能块。

在查看 IEC 规范时,我意识到IEC 指令列表表单可能是编译器的目标语言。维基百科文章列出了两种开发工具:

  1. CoDeSys
  2. 贝雷米兹

但这些似乎是针对将 IEC 语言编译为 C,而不是 C 编译为 IEC。

另一种可能的解决方案是通过 C 到 Pascal 转换器推送 C 代码,并将其用作结构化文本解决方案的起点。

如果不是其中任何一个,我将沿着将代码拆分为功能块的路线。

编辑

正如mlieson 的回复所提示的,我应该提到C 代码是一个现有的实时控制系统。所以程序算法应该已经适合 PLC 环境。

4

7 回答 7

4

也许这个答案来得太晚了,但由于有一个外部库,可以从 CoDeSys 调用 C 代码。

您可以在http://forum-en.3s-software.com/viewtopic.php?t=620的 CoDeSys 论坛上找到文档

这将使您可以在稍作修改的情况下将 C 代码用于 PLC。您只需定义功能或功能块接口。

于 2009-10-15T12:25:32.470 回答
3

我的猜测是,C 到 Pascal 的翻译器不会让你离得足够近,不值得麻烦。结构化文本看起来很像 Pascal,但您需要在各处修复差异。

不是错误问题,但不要忘记 PLC 的运行时环境有点不同。AC 应用程序从 main() 开始,并在 main() 返回时结束。PLC 一遍又一遍地调用它 main(),每秒 100:s 次,它永远不会结束。通常冗长的计算和 I/O 需要以不同于 C 应用程序使用的方式进行编码。

除非您的 C 源代码是数千行代码 - 重写它。

于 2009-04-16T22:58:13.293 回答
2

是不可能的。简而言之:IL 语言是一种 4GL(即仅限于域,以及其他 IEC 61131-3 语言——ST、FBD、LD、SFC)。C语言是3GL。

为了理解这个问题,试着回答这个问题,用指针在 IL 操作中表达的方式是什么?例如,通过指针来表达调用函数。中断怎么办?对外围设备的低级访问?

(真的,还有更多的问题)

顺便说一句,有 Reflex 语言,又名“带有进程的 C”。Reflex 是用于控制域的 4GL,具有类似 C 的语法。但是已知的翻译器会生成 C 代码和 Python 代码。

于 2011-08-17T17:04:34.333 回答
1

There are a few IEC development environments and target hardware that can use C blocks... I would also take a look at the reasons why it HAS to be an IEC-61131 complaint target. I have written extensively on compliance and why it doesn't mean squat. SOFTplc corp can help I'm sure with user defined loadable modules... and they can be in C..

Schneider also supports C function blocks...

Labview too!! not sure why IEC is important that's all!! the compiler if existed would create bad code for sure:)

于 2011-08-21T20:17:16.477 回答
1

如果要转换的代码量是几千行,那么手动重新编码可能是您最好的选择。

如果您有很多代码要转换,那么自动化工具可能会非常有效。使用DMS 软件再造工具包,我们构建了将机械运动图映射到 RLL (PLC) 代码的转换器。DMS 还具有完整的 C 解析器/分析器/前端。这些部件用于构建 C 到 RLL 代码。

这不是一件容易的事。将 DMS 配置为类似于您想要的东西可能需要 6-12 个人工月。如果这比手工完成的要少,那么它就是正确的方法。

于 2009-10-03T06:07:24.167 回答
0

您最好的选择是将您的 C 代码拆分为更小的部分,这些部分可以重新编码为 PLC 功能块,并为您将在结构化文本中重写的每个块使用 C 到 PASCAL 转换器。准备做大量的手动工作,因为自动转换可能会让您失望。

也看看这个页面: http: //www.control.com/thread/1026228786

于 2011-08-19T13:34:19.057 回答
0

每次我这样做时,我只是手动将其从 C 直接解析并转换为 ST。我只遇到了几个需要完全重写的函数,尽管很少有处理指针的东西,不幸的是,ST 通常会扼杀这一点。

于 2015-02-19T16:23:22.677 回答