2024年2月5日发(作者:)
/*
void main(void)
{
a = scankey();
if(a=1)// 一般应该以状态标志作为选择判断的依据,因为按实际,每一个动作的执行都是在一定的状态下进行的。所有理所当然应该以状态作为选择的首要依据,而不是动作;在每个特定的状态下,在依据不同的动作,选择不同的处理方法。所有程序分支的设计思路是:首先利于状态进行大分支,然后在每个大分支下再利于动作变量进行分支选择;但要注意区分状态保持和状态切换两个不同的情况(利用标志赋值前的自判断来实现)。
{
startpump();
delay5sec();
starthitter();
}
else
{
}
}
*/
void main(void)
while(1)
{
a = scankey();
if(ispumpStarted == 0) // 一般应该以状态标志作为选择判断的依据,因为按实际,每一个动作的执行都是在一定的状态下进行的。所有理所当然应该以状态作为选择的首要依据,而不是动作;在每个特定的状态下,在依据不同的动作,选择不同的处理方法。所有程序分支的设计思路是:首先利于状态进行大分支,然后在每个大分支下再利于动作变量进行分支选择。
{
if(a==1)
{
startpump();
ispumpStarted = 1;
starttime = 0;
}
}
else
{
if(starttime > 5)//条件由定时时间而定,可以通过mplab sim测试,从而确定条件
{
starthitter();
}
if(a==0)
{
stoppump();
ispumpStarted = 0;
}
}
starttime++;
}
基本概念:状态,状态保持,状态切换;
//编程中的状态与动作的思想,非非非常重要:状态又分为不同部件的状态和系统的状态,不同部件的状态的一个组合就确定系统的一个状态,
部件所有状态的组合就构成了系统的所有状态。所谓的编程,就是用程序根据不同的动作来实现系统状态的转换。以相关动作去控制对象的状态,有面向对象的思想。
什么是对象:具体属性和方法的集合就是对象
类:抽象属性和方法的集合。
//编程思路:
1.首先设动作变量(一般为输入控制信号),设状态标志变量,状态变量(标志是一个对象不同状态的组合情况,即一个对象的所有状态变量确定时,可确定一个状态标志);
2.依据实际情况,初始化各状态变量和动作变量,使系统在加电时处在需要的状态下
2.扫描动作变量(一般为输入)
3.扫描到动作变量改变时,利用状态标志变量判断系统或部件的状态,然后对每一种可能(要具有思维的严密性和完备性),通过清零和置一相关对象状态位来实现需要执行的动作
(即用函数体实现相关功能,也就是在函数体内实现将对象从一个状态到另一个状态的转换)。
注:给每个对象的状态设定一个标志变量,这样更一目了然的知道对象所处的状态,才更利于编程;
4. 一般都需要循环扫描动作变量,并由它的值去控制对象的状态变换
过程一般是这样:在循环体内首先扫描动作变量,然后利于状态标志变量判断每个对象的当前状态,在确定的当前状态下和相应的动作变量变化下,可以确定程序的执行分支,从而完成相应控制。编写的程序一定要考虑到系统的每一个状态和每一个动作的组合,这样程序才具有严密性和完备性,对每个对象所处的不同状态(考虑一切可能状态),分别依据动作变量的可能情况(也需要考虑一切可能情况),给出每一种处理方法(即通过置一和清零对象的状态变量来实现状态的转换);编写的程序要具备严密性和完备性,但程序在执行时并不是每次都执行完每一个程序分支,程序执行时,它是根据当前状态和当前动作做出自动选择执行的。
5.在考虑“4”中所说的严密性和完备性时,必须考虑到我们实际控制的需要,并不一定要非要考虑到每一种逻辑可能性。下举例说明:以空调加热器控制模块为例,但系统加电时,假设刚开始水泵的状态为停止状态,则在该状态分支内,按实际情况,我们只需要考虑启动开关这个动作,而不需考虑停止开关这个动作。可参见上程序部分。
补充:在考虑严密性和完备性时,除了要考虑组合逻辑,还必须注意时序逻辑(很重要),即程序在执行的过程中,动作在不同时刻(考虑时间的每一种可能性)触发时,程序是否都满足需要。
//思路:1.首先定义动作变量和对象的状态变量、对象的状态标志变量。
2.根据控制要求,利于动作变量的变化去控制相关动作(即对象由一个状态变为另一个状态,动作后一定记得将对象的状态标志位清理或置一)
//在自己的复合语句中将自己置一或清零;
//“编程的状态变量法”与电路分析的状态变量法有惊人的相似,也与PLC的状态变量编程法相似。
按电路的状态变量分析法,输入输出变量不属于状态变量的范畴,系统包含四个要素:输入变量,状态变量,初始条件,输出变量。一般而言状态变量可以看成是内部变量,但也可是输出变量。
由状态变量法,但已知各状态变量的初值和输入时,在系统状态方程已知的情况下,系统有唯一的解。即可确定系统任意时的状态。而系统的输出可由输出方程求出。
系统方程包含:状态方程(状态方程含输入向量和各状态的初值向量);输出方程。系统方程的矩阵形式,使系统方程变得紧凑。而系统方程的矩阵形式,应可以给编程以极大的启迪,
利用矩阵形式来组织数据类型(即定义矩阵数据类型),应可以大大简化程序的编写,且使程序极其紧凑。 逻辑的与就对应矩阵元的乘法;逻辑或可以利用摩根定律转换成其非的逻辑与运算;当然与也可利用矩阵的加法,但需要特殊处理。
系统的矩阵编程法:定义矩阵数据类型,定义输入矩阵、状态矩阵和输出矩阵类型变量;初始化,即给输入矩阵、状态变量矩阵和输出矩阵赋初值;读输入矩阵;编写状态矩阵方程;利用输出矩阵方程和状态矩阵方程求取输出矩阵;执行输出;循环至读输入矩阵。
本质上“动作”仅仅是输入变量的改变,而一般我们可以用输出量来表象的表征系统的状态,但这不是太合理,但在编程时是可以这样处理的。
技巧:在各程序中,还可以嵌入调试有条件编译指令。这样利用调试
流程:定义;初始化;读输入;运算设定状态标志(注意设定标志时要区分状态的保持和状态的转换);利用标志实现相关动作。
编程时一定要考虑好,在哪些地方(一般都是在状态转换时)必须对某些标志、变量清零;不然易出错。
一般对标志进行赋值之前都要判断标志前一个时刻的状态,这样做可以区分出下一个状态是原来状态的保持,还是有另外一个状态切换到此状态的。即利用赋值前的判断来区分状态的保持和状态的转换两种不同情况。在编程时应特别注意,因为在状态转换时,往往都要涉及对某些变量(一般是各个状态的公用变量)进行清零,而在状态保持阶段,无此操作。方向灯控制时,ON_TIME的清零就是一个例子。也就是涉及不同状态之间的独立性问题和耦合性问题。在设计程序时,在能够满足控制要求的前提下,尽量减少各个状态之间的耦合性,在不同状态下,少用或不用公用变量。
本文发布于:2024-02-05 20:30:33,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170713623358292.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |