菜鸟发问,我该怎么摆脱用PLC思路编写单片机程序的烦恼?

[复制链接]
3631|9
 楼主| Sxin 发表于 2009-1-5 09:19 | 显示全部楼层 |阅读模式
我是学PLC出身的&nbsp;<br />我感觉PLC有很大的依赖性<br />所以作为爱好,想学习学习单片机<br />我试着编写单片机程序时(C语言)<br />总是摆脱不了PLC程序的干扰<br />或者说不明白C语言到底怎么实现一些简单的功能,比如起保停电路<br />目前只能根据下载的现成程序写写单灯点亮,流水灯等<br />但是自己试图去写一个水塔水位的程序时就歇菜了<br />(主要问题是单片机里多是赋值,该停的不知道怎么停,不该停的不知道怎么保持)<br /><br />看了ic921的新手怕什么,我决定问一下<br />希望不要笑话,每个人都有长有短<br /><br />希望有高人指点一下,PLC编程思路到单片机编程思路的转换技巧<br /><br />谢谢
iC921 发表于 2009-1-5 09:41 | 显示全部楼层

哈哈,别怕

我发那样的帖子,根本目的是:一让“新人”(不一定是新手)不要怕,二防有人忽略新人的特点,坏他们的心情。呵呵,有些人说话比较随便。<br /><br />当然,一般不会有人欺负你们的。这是21IC最大的优点之一。<br /><br />PLC我学过一点,不算熟悉。这个东西有点模块化设计的概念,但与编程语言细腻的逻辑风格是大同小异。传统概念的PLC不讲运算,但逻辑循环这一点是相同的。<br /><br />PLC的逻辑循环是直接执行,而程序语言则要经过判断才转向。出口和入口都这样。可以说,PLC是程序语言的简化。<br /><br />不太熟PLC,先这么多吧。有可能的话,顺便跟你学习学习~
 楼主| Sxin 发表于 2009-1-5 10:08 | 显示全部楼层

看见版主 我不怕不怕了

<br />比如PLC的水塔水位程序:<br />(水位低于low,水泵启动;高于high,水泵停;达到alarm,水泵停)<br />https://bbs.21ic.com/upfiles/img/20091/20091595855307.jpg<br />再看我写的单片机程序(总是用PLC的思路):<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&quot;reg51.h&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&ltstdio.h&gt&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;low=P3^5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;high=P3^4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;alarm=P3^2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;motor=P1^0;<br /><br />main(&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(((low==1)|(motor=0))&&(high==1)&&(alarm==1))&nbsp;&nbsp;&nbsp;&nbsp;motor=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;motor=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />这个程序运行的效果不符合要求<br />有谁可以写一个程序给我看看打开一下思路嘛?<br />谢谢
iC921 发表于 2009-1-5 17:23 | 显示全部楼层

我几乎不编程了,试说一下

前面有话是个粗略说明,老感觉。<br /><br />下面几个语句,有效电平可不是一样的。low&nbsp;和&nbsp;motor&nbsp;的有效逻辑应该和high和alarm相反。事实上是不是这样,请你详查:<br /><br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;low=P3^5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;high=P3^4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;alarm=P3^2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;motor=P1^0;<br /><br />------------------------------<br />这句如何解读,帮忙解决一下:<br />main(&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(((low==1)|(motor=0))&&(high==1)&&(alarm==1))&nbsp;&nbsp;&nbsp;&nbsp;motor=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;motor=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}
tc9148 发表于 2009-1-17 23:10 | 显示全部楼层

梯形图也是造句,呵呵。

  
NE5532 发表于 2009-1-18 14:20 | 显示全部楼层

在细化一些就是了。

你就把PLC当VB,把单片机当汇编好了。
computer00 发表于 2009-1-18 14:33 | 显示全部楼层

俺给你来个思路清晰的:

&nbsp;&nbsp;&nbsp;&nbsp;#include&quot;reg51.h&quot;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;#include&nbsp;&ltstdio.h&gt&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;low=P3^5;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;high=P3^4;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;alarm=P3^2;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sbit&nbsp;motor=P1^0;<br /><br />main(&nbsp;)<br />{<br />&nbsp;char&nbsp;MotorOn;<br />&nbsp;<br />&nbsp;while(1)&nbsp;//死循环<br />&nbsp;{<br />&nbsp;&nbsp;MotorOn=1;&nbsp;//设置为启动状态<br />&nbsp;&nbsp;if(hight==1)&nbsp;//高水位,停<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;MotorOn=0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;if(alarm==1)&nbsp;//警戒水位,停<br />&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;MotorOn=0;<br />&nbsp;&nbsp;}<br />&nbsp;&nbsp;motor=MotorOn;&nbsp;&nbsp;//设置水泵的状态<br />&nbsp;}<br />}<br /><br />其实简化一下就是:<br />if((hight==1)||(alarm==1)<br />{<br />&nbsp;motor=0;<br />}<br />else<br />{<br />&nbsp;motor=1;<br />}
mugenwon 发表于 2009-1-22 15:07 | 显示全部楼层

while(1)

如果要程序有效这个(或者类似的goto&nbsp;,定时器等)一定要用。<br />我喜欢这样:<br />&nbsp;&nbsp;&nbsp;<br />sbit&nbsp;motor=P1^0;<br /><br />#define&nbsp;mt_run()&nbsp;motor=0&nbsp;&nbsp;//这可不是多余的<br />#define&nbsp;mt_stop()&nbsp;motor=1<br /><br />下面就这么用:<br /><br />mt_stop();
yewuyi 发表于 2009-1-23 10:53 | 显示全部楼层

你如果真理解了PLC底层,你就发现那才是很合理的

所以,别想着改,先想着弄懂PLC底层。。。
quakegod 发表于 2009-2-1 01:51 | 显示全部楼层

偶搞过PLC

其实你那个程序的写法是对的,但是逻辑不是很对。<br />首先你那个梯形图好像就不对,low应该改成常开触点。<br />其次,PLC里面都是继电器元件,有断开和闭合状态<br />但是在单片机里只有0和1,要把这两个关系对应好才行。<br />看看你的程序<br />main(&nbsp;)<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;{<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if(((low==1)|(motor=0))&&(high==1)&&(alarm==1))&nbsp;&nbsp;&nbsp;&nbsp;motor=0;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;else&nbsp;motor=1;<br />&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;}<br />这里&nbsp;Low,High,alarm是输入,那么多少是表示有信号呢?常闭还是常开触点呢?<br />low==1,high==1是不可能同时达成的,你写在1句话里怎么能行呢。<br />
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝
快速回复 在线客服 返回列表 返回顶部