编译器开发

654 阅读2分钟

一、PLC基础

  1. PLC的5种编程语言标准:SFC(Sequential Flow Chart,顺序流程图)、ST(Structure Text,结构化文本)、FBD(Function Block Diagram,功能块图)、LD(Ladder Diagram,梯形图)和 IL(Instruction List,指令表)。
  2. IEC61131-3技术标准:
graph LR
A[IEC61131-3] --> B(公共元素)
A[IEC61131-3] --> C(编程语言)
B --> D(软件模型)
B --> E(程序组织单元)
B --> F(编程模型)
B --> 数据外部表示
B --> 变量
B --> SFC
D --> 配置Configration
D --> 资源Resource
D --> 任务Task
D --> 存取路径Access&nbspPath
D --> 全局变量Global&nbspVariable
E --> 函数Function
E --> 功能块Function&nbspBlock
E --> 程序Program
C --> G(文本编程语言)
C --> H(图像编程语言)
G --> 结构化文本ST
G --> 指令表IL
H --> 梯形图LD
H --> 功能块图FBD
  1. PLC特别是在多任务条件下的采样,存在着很大的抖动(Jitter)和不确定性。
  2. 整型变量限定值域:

<变量名>: 整形类型(<下限>..<上限>);

VAR
    nSTATE:INT(0..1023);
END_VAR
  1. 常数表示:

<类型>#<数值>

2#1001_1100  //二进制表示法
  1. 普通变量定义:

<标识符>:<数据类型>:=<初始值>

7.选择类操作:

Result:=SEL(G,IN0,IN1); //G=0,输出IN0,;G=1,输出IN1
Result:=LIMIT(Min,IN,Max); //对输入变量IN进行上下限幅。
  1. 比较类操作:
=    等于
<>  不等于
>=  大于等于

二、SFC编程

  1. SFC语言的基本构成概念是“步”和“转移”。
graph TD
Init --> |trans0 转移条件0| Step0
Step0 --> |trans1 转移条件1| Step1
  1. 动作限定符:在“步”的“动作”区域之间插入一些特定的符号,约定当一个步激活的时候,这些符号后面的那些动作如何执行。其中“动作”指的是步的行为。

三、ST编程

  1. 事实上,采用SFC和ST进行搭配编程在产品开发中很有效,SFC用于构建软件的逻辑框架,而ST则用于描述各种具体的实现。

四、面向对象的PLC编程技术

  1. THIS和SUPER指针主要应用于功能块的拓展和继承。
  2. 接口是一种数据结构,将功能块的方法和属性等函数的原型集合起来
  3. 进行流水灯的设计实现

五、OpenPLC开发

stage4详解

  1. 调用stage4函数,输入参数为symbol_c类型的tree_root和const char* 类型的builddir
  2. 调用new_code_generator函数,输入参数为stage4out_c类型变量s4o的地址和const char* 类型的builddir,输出为visitor_c* 类型的变量generate_code

六、matiec源码编译

编译流程

  1. IDE编写SFC和ST混合程序,生成XML文件,然后调用xml2st龚俊将xml文件转为ST文件plc.st
  2. 将plc.st输入matiec,输出一系列C文件
  3. 通过服务器139中/root/.zeranoe/mingw-w64/x86_64/bin/路径下的交叉编译工具链将上述C文件编译成一个so文件
  4. 该so文件下载到runtime进行运行

matiec原理

  1. iec2c编译程序生成标准C代码,并且C代码与输入的IEC 61131-3代码一致
  2. iec2iec编译程序生成与输入的IEC 61131-3代码一致的IEC 61131-3代码
  3. 可以通过$./configure; make来编译/生成这些编译程序
  4. 编译工作的各个阶段:
  • 阶段1 词法分析 由stage1_2/iec_flex.ll完成
  • 阶段2 语法解析 由stage1_2/iec_bison.yy完成
  • 阶段3 词义分析 开源代码目前只做到类型检查
  • 阶段4 代码生成 生成ANSI C代码
  • 阶段5 Bin代码生成 未集成到matiec编译器中。必须由用户显式调用
  1. gcc语法树的缺陷:gcc语法树没有很好的文档记录,对这棵树进行语义检查可能是噩梦

Flex和Bison(词法分析和语法分析)

  1. 词法分析:把输入分割成一个个有意义的词块,成为记号(token)
  2. 语法分析:确定这些记号是如何彼此关联的。

例如 a = b + c;,词法分析器把这段代码分解为这些记号:a,=,b,+,c,;。接着语法分析器确定b+c是一个表达式,而这个表达式被赋给了a。

七、VMware ubuntu下搭建runtime运行环境并加载本地so文件

  1. 在VMware ubuntu下载runtime源代码
  2. 修改start.sh脚本文件,添加临时环境变量(添加libCoummModule.so的路径)
export LD_LIBRARY_PATH=$LD_LIBRARYPATH:/root/runtime/runtime_application/lib
  1. 执行./start.sh
  2. 在本地打开SugonRI2.0
  3. 点击在IDE左下方的扫描按钮获取ubuntu中启动的runtime
  4. 继续点击登录
  5. 然后点击运行

如果VMware ubuntu和本地无法连接的处理方法:
修改虚拟机中网络适配器的网络连接模式为仅主机模式