打印

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

[复制链接]
2717|9
手机看帖
扫描二维码
随时随地手机跟帖
跳转到指定楼层
楼主
Sxin|  楼主 | 2009-1-5 09:19 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我是学PLC出身的 
我感觉PLC有很大的依赖性
所以作为爱好,想学习学习单片机
我试着编写单片机程序时(C语言)
总是摆脱不了PLC程序的干扰
或者说不明白C语言到底怎么实现一些简单的功能,比如起保停电路
目前只能根据下载的现成程序写写单灯点亮,流水灯等
但是自己试图去写一个水塔水位的程序时就歇菜了
(主要问题是单片机里多是赋值,该停的不知道怎么停,不该停的不知道怎么保持)

看了ic921的新手怕什么,我决定问一下
希望不要笑话,每个人都有长有短

希望有高人指点一下,PLC编程思路到单片机编程思路的转换技巧

谢谢

相关帖子

沙发
iC921| | 2009-1-5 09:41 | 只看该作者

哈哈,别怕

我发那样的帖子,根本目的是:一让“新人”(不一定是新手)不要怕,二防有人忽略新人的特点,坏他们的心情。呵呵,有些人说话比较随便。

当然,一般不会有人欺负你们的。这是21IC最大的优点之一。

PLC我学过一点,不算熟悉。这个东西有点模块化设计的概念,但与编程语言细腻的逻辑风格是大同小异。传统概念的PLC不讲运算,但逻辑循环这一点是相同的。

PLC的逻辑循环是直接执行,而程序语言则要经过判断才转向。出口和入口都这样。可以说,PLC是程序语言的简化。

不太熟PLC,先这么多吧。有可能的话,顺便跟你学习学习~

使用特权

评论回复
板凳
Sxin|  楼主 | 2009-1-5 10:08 | 只看该作者

看见版主 我不怕不怕了


比如PLC的水塔水位程序:
(水位低于low,水泵启动;高于high,水泵停;达到alarm,水泵停)
https://bbs.21ic.com/upfiles/img/20091/20091595855307.jpg
再看我写的单片机程序(总是用PLC的思路):
     #include"reg51.h"
     #include <stdio.h> 
     sbit low=P3^5;
     sbit high=P3^4;
     sbit alarm=P3^2;     
     sbit motor=P1^0;

main( )
     {
     if(((low==1)|(motor=0))&&(high==1)&&(alarm==1))    motor=0;
       else motor=1;
     }
这个程序运行的效果不符合要求
有谁可以写一个程序给我看看打开一下思路嘛?
谢谢

使用特权

评论回复
地板
iC921| | 2009-1-5 17:23 | 只看该作者

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

前面有话是个粗略说明,老感觉。

下面几个语句,有效电平可不是一样的。low 和 motor 的有效逻辑应该和high和alarm相反。事实上是不是这样,请你详查:

     sbit low=P3^5;
     sbit high=P3^4;
     sbit alarm=P3^2;     
     sbit motor=P1^0;

------------------------------
这句如何解读,帮忙解决一下:
main( )
     {
     if(((low==1)|(motor=0))&&(high==1)&&(alarm==1))    motor=0;
       else motor=1;
     }

使用特权

评论回复
5
tc9148| | 2009-1-17 23:10 | 只看该作者

梯形图也是造句,呵呵。

使用特权

评论回复
6
NE5532| | 2009-1-18 14:20 | 只看该作者

在细化一些就是了。

你就把PLC当VB,把单片机当汇编好了。

使用特权

评论回复
7
computer00| | 2009-1-18 14:33 | 只看该作者

俺给你来个思路清晰的:

    #include"reg51.h"
     #include <stdio.h> 
     sbit low=P3^5;
     sbit high=P3^4;
     sbit alarm=P3^2;     
     sbit motor=P1^0;

main( )
{
 char MotorOn;
 
 while(1) //死循环
 {
  MotorOn=1; //设置为启动状态
  if(hight==1) //高水位,停
  {
   MotorOn=0;
  }
  if(alarm==1) //警戒水位,停
  {
   MotorOn=0;
  }
  motor=MotorOn;  //设置水泵的状态
 }
}

其实简化一下就是:
if((hight==1)||(alarm==1)
{
 motor=0;
}
else
{
 motor=1;
}

使用特权

评论回复
8
mugenwon| | 2009-1-22 15:07 | 只看该作者

while(1)

如果要程序有效这个(或者类似的goto ,定时器等)一定要用。
我喜欢这样:
   
sbit motor=P1^0;

#define mt_run() motor=0  //这可不是多余的
#define mt_stop() motor=1

下面就这么用:

mt_stop();

使用特权

评论回复
9
yewuyi| | 2009-1-23 10:53 | 只看该作者

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

所以,别想着改,先想着弄懂PLC底层。。。

使用特权

评论回复
10
quakegod| | 2009-2-1 01:51 | 只看该作者

偶搞过PLC

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

使用特权

评论回复
发新帖 我要提问
您需要登录后才可以回帖 登录 | 注册

本版积分规则

2

主题

4

帖子

0

粉丝