Eclipse Xtext 实现PLC ST 语言到C的转换

news2024/12/23 14:24:04

   Eclipse Xtext 是开发领域专用语言(DSL)的工具。例如数据库的SQL 语言,PLC 的ST 语言都是一种领域专用语言。在开放自动化领域,提倡基于模型的设计方法。DSL 是描述模型的强有力工具。

   在开发PLC 程序IDE时,开发ST编译器是一项重要的任务,使用的方法大致有两种:

  •   使用 Bison 和Flex
  •    使用Eclipse Xtext

  开源PLC项目Beremiz中,使用的就是Bison/Flex.而IEC61499 开源项目4diac 中使用的是Xtext。关于Xtext 实现ST 到C语言转换,我在两年前做过,有一些读者觉得不够详细,最近又将Eclipse Xtext 实现ST 语言转化为C++ 程序的过程做了一遍。供读者参考。其中的语法描述和代码生成是从4diacIDE 移植过来的。

整个过程在Window 下完成。

下载Eclipse Install 

官网地址:

Eclipse Downloads | The Eclipse Foundation

运行Eclipse Install

        以前介绍Xtext 是Eclipse Modeling Tool 下加Xtext 插件的方式安装Xtext IDE ,现在不需要了,直接选择安装DSL Developers 就可以了。 

新建一个xtext项目

新建了xtext 项目之后,回在Eclipse workspace 下建立了4 个项目。

 xtext 项目开发的主要工作

描述你打算开发的DSL 语言的语法描述文件。这是一个xtext 的文件

编写代码生成程序,这是一个xtend 文件

运行mwe2

运行DSL 编辑器

这相当于自动生成了一个DSL 的Eclipse IDE。你可以在里面编辑一个xxx.ST 文档,能够高亮关键字等等。 

独立的命令行编译程序

        我们已经知道,Eclipse Xtext 项目会建立一个针对DSL 的Eclipse IDE。在这个DSL IDE下能够编辑DSL 。但是,有时我们只需要一个独立的命令行编译器(类似于gcc)。Eclipse Xtext 项目能够导出命令行编辑程序。

     鼠标指向Main.Java文件 击右键 Run As | Java Application 这时在控制台下会出现“Aborting: no path to EMF resource provided!" 不要担心,因为你没有带任何命令参数。

 文件菜单中选择 Export... | Java | Runnable JAR File,然后点击 Next.

  按如下设参数
  

运行

PS E:\yao2023\eclipse-workspace> java  -jar STCompiler.jar ./GenericFB.ST
Code generation finished.
PS E:\yao2023\eclipse-workspace>

 ST 代码

VAR
	X :INT;
	Y:REAL;
	Z:BOOL;
	A:ARRAY[1..12] OF INT;
	i:INT;
END_VAR;
IF Z THEN
	X:=0;
	X:=X*60;
	Y:=sin(3.14156);
ELSIF X>0 THEN 
	X:=10;
ELSE
   X:=10;		
END_IF;
	Z:=TRUE;
	i:=0;
WHILE i<14 DO
	A[i]:=i;
	i:=i+1;
END_WHILE;
	X:=3;
FOR i:=0 TO 12 DO
    X:=X+i;
END_FOR;
CASE i OF
0:i:=1;
1:i:=2;
END_CASE;
RETURN;

翻译的C语言

int X;
double Y;
bool Z;
int A[11];
int i;
if(Z) {
	X = 0;
	X = MUL(X, 60);
	Y = sin(3.14156);
}
else if((X > 0)) {
	X = 10;
}
else {
	X = 10;
};
Z = true;
i = 0;
while((i < 14)) {
  A[i] = i;
  i = ADD(i, 1);
};
X = 3;
for(i = 0;i <= 12;i = i +1){
	X = ADD(X, i);
};
switch (i) {
	case 0:
		i = 1;
		break;
	case 1:
		i = 2;
		break;
}
return;

过程记录难免不全,有问题就问吧!

结束语

        最近再次对DSL 感兴趣的原因是本人对自动化行业的信息模型文本描述十分关注。觉得使用DSL 语言描述模型更加有效。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1106411.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32-LCD液晶显示

LCD液晶显示 针对野火指南者配套资料&#xff1a;3.2寸 LCD电阻屏&#xff0c;屏幕里自带ILI9341液晶控制器芯片&#xff0c;该控制器芯片中存在GRAM&#xff08;即显存&#xff09;。该液晶控制器使用8080接口与单片机通讯&#xff0c;液晶面板引出来的FPC信号线为8080接口&am…

ESP RainMaker 客户案例 #1|Halonix

Halonix 是印度规模增长最快的电器公司之一&#xff0c;专注于照明、风扇等电器产品&#xff0c;正在进军健康和安全领域&#xff0c;现已推出紫外线消毒器和安全摄像头。Halonix 致力于创新&#xff0c;不断采用新兴前沿技术实现产品迭代&#xff0c;并通过加强设备间的互联互…

23.项目开发之量化交易抓取数据QuantTradeData(二)

后端业务&#xff1a;定时更新“A股日线行情”数据 需求说明 为了获取前一天的最新数据&#xff0c;我们需要每天晚上10点定时刷新daily股票列表基础信息&#xff0c;并将最新数据插入或更新到数据库中。 如果该内容是在当天交易日信息未更新前查询&#xff08;15~16点之前&a…

谢宝栋教授:左心室辅助装置最新进展【ACC最新科学声明解读】

谢宝栋教授 主任医师 哈尔滨医科大学附属第一医院心脏大血管外科主任 独立完成十余例LVAD手术&#xff0c;具有丰富经验。 心力衰竭&#xff08;HF&#xff09;是一种严重的心脏病&#xff0c;导致心脏无法有效地泵送血液到全身。根据指南指导的药物治疗虽然可以缓解部分HF患…

ubuntu 18.04 开机自启 打开终端执行脚本

一 打开设置开机自启配置程序 alt F2 输入 gnome-session-properties 或 终端输入 gnome-session-properties 二 添加开机自启配置 点右方的add加入 填写名称&#xff0c;可自定义 填写指令&#xff0c;即开机想要执行的指令 gnome-terminal -x bash -c “ls; exec bash” …

JAVA生成ORC格式文件

一、背景 由于需要用到用java生成hdfs文件并上传到指定目录中&#xff0c;在Hive中即可查询到数据&#xff0c;基于此背景&#xff0c;开发此工具类 ORC官方网站&#xff1a;https://orc.apache.org/ 二、支持数据类型 三、工具开发 package com.xx.util;import com.alibab…

安防视频监控平台EasyCVR出现视频流播放卡顿情况,如何优化?

视频集中存储/云存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、智能分析等。AI智能/大数据视频分析EasyCVR平台已经广泛应用在工地、工厂、园区、楼…

成都股票开户选择哪家证券公司开户最便宜?炒股开户佣金最低是多少?

成都股票开户选择哪家证券公司开户最便宜&#xff1f;炒股开户佣金最低是多少&#xff1f; 股票开户是指向证券公司注册开立证券账户&#xff0c;以便购买和销售股票。一般而言&#xff0c;股票开户需要提供身份证明、联系方式、银行账户等信息并完成相应的申请手续。开户后&a…

postman请求400错误-日期LocalData

错误日志参考 [nio-8080-exec-3] .w.s.m.s.DefaultHandlerExceptionResolver : Resolved [org.springframework.web.method.annotation.MethodArgumentTypeMismatchException: Failed to convert value of type java.lang.String to required type java.time.LocalDate; neste…

RK3568驱动模块编译进内核

一、创建文件 首先在drivers/char目录下创建hello文件夹&#xff0c;然后在hello文件夹下创建hello.c 文件、Kconfig和Makefile文件。   hello.c 文件内容如下 #include <linux/module.h> #include <linux/kernel.h> static int __init helloworld_init(void) …

Shell 一键替换当前目录下所有文件的指定内容

文件内容&#xff1a; 脚本&#xff1a; #!/bin/bash source_content"127.0.0.1" target_content"helo cloudmusic"# 指定目录 directorypwd# 使用循环遍历目录中的每个文件 for file in "$directory"/* doif [ -f "$file" ]; then# …

B站狂转清华大佬手写笔记:Spring Security+ OAuth2.0分布式认证授权

微服务认证方案 微服务认证方案目前有很多种&#xff0c;每个企业也是大不相同&#xff0c;但是总体分为两类&#xff0c;如下&#xff1a; 网关只负责转发请求&#xff0c;认证鉴权交给每个微服务商控制统一在网关层面认证鉴权&#xff0c;微服务只负责业务 你们公司目前用…

保姆级教程:百度AI简单使用

1.进入AI对话界面 随便提个问题 这里我选择了程序猿小助手 文心一言网站 https://yiyan.baidu.com/welcome 文心一言可以做什么 与人对话互动&#xff0c;回答问题&#xff0c;协助创作&#xff0c;高效便捷地帮助人们获取信息、知识和灵感。 参考截图

SSO身份验证如何帮助加强密码安全性

单点登录 &#xff08;SSO&#xff09; 是一种身份验证服务&#xff0c;可帮助用户使用一组凭据快速安全地访问所有应用程序。在员工需要访问多个应用程序才能完成工作的企业环境中&#xff0c;每次需要访问时都必须为每个应用程序输入登录凭据&#xff0c;这是一个主要的烦恼来…

C语言求 sinh(x)=(e^x - e^-x)/2,其中 e^x 用单独函数返回值

完整代码&#xff1a; // 求 sinh(x)(e^x - e^-x)/2&#xff0c;其中 e^x 用单独函数返回值 #include<stdio.h> #include<math.h>int main(){double x,sinh;printf("请输入一个数");scanf("%lf",&x);sinh(exp(x)-exp(-x))/2;printf("…

微信扫码跳转到小程序内部,浏览器扫码跳转到App 内部,如果手机上没有安装App ,跳转到下载页

第一:微信扫普通二维码跳转到小程序 第一步:登录微信公众平台,左侧点击开发管理,点击开发设置,滑到最下边,找到扫普通链接二维码打开小程序,配置对应的二维码链接,注意要拿这个链接去生成二维码,这样微信扫码才能跳转到小程序内部,还有那个校验文件,让后台放到对应的文件夹下,…

Elasticsearch基础篇(五):创建es索引并学习分析器、过滤器、分词器的作用和配置

创建es索引并学习分析器、过滤器、分词器的作用和配置 一、基础概念Elasticsearch与MySQL的类比1. ES与MySQL的结构类比图2. ES与MySQL的类比示意表格3. 索引中重要概念索引&#xff08;Index&#xff09;文档&#xff08;Document&#xff09;字段&#xff08;Field&#xff0…

值类型引用类型区别

例子 using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks;namespace Demo2 {internal class Program{static void Main(string[] args){#region 值类型int a 1;int b a;b 2;Console.WriteLine("a&…

【微信小程序调试工具试用】

【微信小程序调试工具试用】 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09;本次工具分享到此结束 什么是爬虫逆向&#xff1f; 试用大佬开发的dll拿到某物小程序sign签名 &#xff08;过于简单 大佬勿喷&#xff09; 1 如图 下面小程序…

c语言练习92:链表的中间结点

链表的中间结点 链表的结点为空时无法访问其next成员否则会报错 /*** Definition for singly-linked list.* struct ListNode {* int val;* struct ListNode *next;* };*/typedef struct ListNode ListNode; struct ListNode* middleNode(struct ListNode* head){if(h…