PLC程序运行仿真--精于编译原理、控制仿真的大侠请进!(300分)

  • 主题发起人 主题发起人 avant
  • 开始时间 开始时间
A

avant

Unregistered / Unconfirmed
GUEST, unregistred user!
可惜本人没有系统学习过计算机专业知识(现着力与机电控制),在接受
这一课题后苦无进展,要用计算机仿真可编程控制器的运行,输入梯形图或语
句表,通过逻辑运算,得到输出端子状态,并用简单图例仿真演示,不要求完
全实现,只要能实现部分即可。请做过这方面或类似工作的大侠不吝赐教则个!
本人辛苦挣来的专家分,不惜全部奉送!
 
hehe,问题是有些偏了!我还是对论坛有信心的!曾见浙大有位师兄一篇精妙论文,
正讲此题,且言已用Delphi实现,可惜语焉不详,不知这位师兄是否来过本论坛。
有知消息者也有重赏!
 
为什么不直接和他联系?
 
谢谢 g622的关注!
谁做过“行程开关”控件:当一个“运动块”移到它上面时(就象被压下),其状态位
被置为1,运动块停止;当“运动块”移开时,则其状态位被置为0。我困扰的地方是,
“行程开关”应该是被用户使用时动态放到面板上,个数、位置都不能预先知道,
“运动块”移动时怎么知道已经移到了一个“行程开关”上,激发“行程开关”的相
应事件?
 
Avant:
1. Simulate PLC will be a pretty big project. Not mention the Graphy
task, the tough one will be the simulate Ladder Logic. Maybe you can
simulate a simple logic, but you can not put your code in any situation. Forget it if you want to simulate a complete system.

2. "行程开关" in your case, can only be a TShape. When receive your
touch message, the chart's height will be change to the 'pressed'
status. when release message, it will change back to 'normal' status.

when user "动态放到面板", you can run time create the TShape.
When your “运动块” move, you know, it is user's DUTY to keep the
your “运动块” and the "行程开关" on same line, in order they can
touch each other. Therefore, youdo
something like this:

procedure TForm1.WhenMoverMove(Sender: TObject, x, y: integer);
var i: integer
begin

for i := 0 to ComponentCount -1do
begin

if Component is TShape then
begin

if x, y in Component.Rect then

//touch message, and change the shape
end;

end;

end;



Hope it helpful. Good luck
 
谢谢Y9Y,Very helpful!我怎么忘了这一招!
事实上我也知道任务很艰巨(悄悄地说:这是我的毕业设计的一部分...),老师太狠了!
布置下这个,还有两张零号图,n张一号、二号...,我都快晕了!
我只打算实现逻辑与或非,定时器,计数器,RS触发器。要用该死的S7-200语法形式!
发几句牢骚...
大家继续献计献策!
 
看一看也有分啊!~&~
 
│ X1 X3 Y1
├┤├┬┤├--○┤
│ X2 │
├┤├┘
这是最简单的梯形图。有“与”、“或”、“输出”,转换为语句表(类似于
汇编)如下:
LD X1 //表示装入X1
OR X2 //表示或X2,即(X1+X2)
AND X3 //表示与X3,即(X1+X2)*X3
OUT Y1 //表示输出Y1,Y1=(X1+X2)*X3
好,大家先帮我看看,二者之间转化采用什么方法。原来我对每个单元存储向上,
下,左,右等等信息,但稍麻烦一些的转化,就不行了,考虑采用编译原理中二叉树
那种存储方式,可惜没什么头绪,谁帮帮我,300分就成交了!
 
退到这一步,还没有人领分,真有点失望了...
 
关键是你的 图 是怎么表示的,需要用户做什么,
是动态添加吗?
 
├┤├:表示“开始”

┤├-:表示“与”

├┤├┘:表示“或”

用户利用此类图形编制类似“电气继电器控制线路图”。这些图形表示一些
软逻辑:X1、X2、...Xn可能接一个外部开关,开关闭合则其值为true,如上表达式
(X1+X2)*X3,若X1或X2中至少一个闭合,且X3闭合,则输出Y1的值为true,此时与
Y1相连的电动机或其他动力装置就会启动。

我困惑的地方是,怎么把图形表示的这种逻辑关系有效的变换成逻辑表达式(如
(X1+X2)*X3),或者变换成
LD X1 //表示装入X1
OR X2 //表示或X2,即(X1+X2)
AND X3 //表示与X3,即(X1+X2)*X3
OUT Y1 //表示输出Y1,Y1=(X1+X2)*X3
这种类似汇编的语句,然后,计算机就容易推理了。
各位大侠若是因为小弟表达不准而无法帮我,尽管指出,小弟尽力表达明白。

y9y 、SuperMMX你们的意见都很好。哪怕是关注,我也很感激。到时候还可再
加分。
谢谢!



 
我认为可以用扫描的办法来实现。
先读入各个触点的状态,然后对每一行进行扫描,设置相应的输出触点
类似于
|-(430)-(100)
|-(100)-|---(530)
|---(531)
|---(ret)
之类的可以用递归的方法来实现

总之如果使用这种方法的话,必须进行多次扫描,直到所有的输出触点和中间触点
的状态不变为止,才算完成了一次动作。
P.S. 我有一个同学的毕业设计也是类似于此类的仿真程序
 
还想再说两句
在 PLC 中,所有语句的关系只有 AND 或 OR 两种,在
同一行中如果一个块与另一个块的关系不是 OR 的话,那么
就是 AND.
每一行的结构可以表示为类型 T

(BLOCK 1) and (BLOCK 2) and ...

其中 BLOCK 为类型 T 的集合,它们之间的关系为 OR

在进行扫描时对每一个 BLOCK N 进行行的分解,
分解为类型 T 的集合
当有某一行为 True 时,该 BLOCK 为 True
全部行均为 False 时,该 BLOCK 为 False

判断 BLOCK N 的值,在它为 true 时对 BLOCK N+1
进行扫描。
以上均为递归调用。

我想,根据这些差不多能做出来了
 
xiao.lit:
<<我有一个同学的毕业设计也是类似于此类的仿真程序
真的么?能告诉我地址,好跟他切磋切磋!
谢谢您的帮助,我会考虑的。
译码这一块,我也有点眉目了!
谢谢!

 
其他的好说,关键是识别出不同的类型。
 
我的那个同学做的是 PLD 的仿真。
他也是刚刚开始。具体情况我也不太清楚
他很少上网,E-mail我去问问。
如果他同意的话,晚上我发到你的信箱里.
 
xiao.lit:
谢谢!
 
自己用个笨方法搞定了
 
多人接受答案了。
 

Similar threads

D
回复
0
查看
2K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
D
回复
0
查看
1K
DelphiTeacher的专栏
D
后退
顶部