
是用于控制实现多段速运行的。如果用这个来控制压力输出。你只能设定恒定值。而PID设定可以有一个反馈渠道,你预先设置最大压力。列如最大压力值是5,变频器范围一般是0到10,当输出压力达不到5只有4时,变频器就会自动反馈到系统当中,这时候变频器就会自动加速运行从而达到标准设定值5,当输出超过设定值5时,这时就是过压,就会通过反馈通道反馈给变频器,此时,变频器就会降低运行速度,达到标准时稳定运行。
你现在想把它改成PLC多段速控制,理论上是不能达到要求的,你怎么知道,多段速运行到哪一个状态的时候(多少HZ)是你想要的标准呢?这个需要你反复试验。或者你从0到15段速都导通,?
多段速的定义就是比如:SS1设10HZ,ss2设15hz,ss3设20hz,ss4设25hz
当你导通在0段速的时候,他运行的就是你系统默认的值,且间隔时间是10秒。。系统默认每个段速之间价格10秒。导通1时,系统运行一段速10hz,导通2时运行2段速15hz,1和2同时导通就是3段速25hz(1+2),导通3时运行4段速20hz,。。这个值是二进制的。(SS1=1,SS2=2,SS3=4,SS4=8)
x0为启动按钮,x1为停止按钮。y0~y7为8盏灯。程序在按下启动按钮后,灯1先亮,1秒(T0延时)后灭,1秒后(T1延时)灯2亮,依次循环。当按下x1后,循环结束。
按下x0后,m0得电为1并自保持,此时1秒计时器T0计时,1秒后T0常开点闭合1秒计时器T1计时,再过1秒T1计时结束常闭点断开T0线圈,
T0失电复位并断开T0常开点,此时T1线圈也失电复位,T1常闭点又闭合,T0得电重复上述计时过程。
第二个程序块:
当M0为1时,在T0触点的上升沿来时k3M10这个二进制数乘以2再写入k3M10中。
K3M10代表M10~M21共12个辅助继电器的组合,那么可以将K3M10看作是一个二进制数。程序未启动时,M10~M21均为0,那么这个二进制数为0;当程序启动时,在下一个程序块中利用了M0的上升沿置位M10,此时M10~M21为1,当T0触点的上升沿来时k3M10(此时为1)这个二进制数乘以2再写入k3M10中(写入后为2),2在二进制数中为10,此时M10失电,M11得电,可以认为M10把"1"交给了M11,以此类推。当第8个M17得电时,完成了一次循环。下一个T0上升沿来到时,M18得电,M17失电。此时下面的程序块利用了M18的上升沿重新置位M10并且将M18复位。这样程序又从M10得电开始循环下去了。
这个程序块的作用就是每次T0的上升沿来到时,“1”在M10~M17之间转移。
一、定义一个原始数据变量;
二、用Wincc function trend control控件画线,使用SetProp函数设置该控件的BeginX,EndX,DataX,DataY等属性,用InsertData插入点
三、必须注意PLC中浮点数的字节顺序和C语言中的不同,可以在PLC程序中使用CAD命令调换字节顺序,也可以在C语言中用循环调换字节顺序
在网上查到了一篇文章,里面的程序说的是WebNavigator下实现趋势曲线显示的问题,很有参考价值。根据这个修改一下,应该可以实现你所要实现的功能。
WinCC Trend in WebNavigator
Nov 30, 2003 1:17 pm, by RK
Subject : HMI
from the Automation List dept
Text :
Hello,
I would like to plot an array in WinCC coming from a PLC I am trying to create this graph using the Trend Control supplied by WinCC I've got a loop that adds the points to the graph and then displays them and it works beautifully in WinCC Runtime, but does not in web Navigator Does anyone know if there is a special initialization process needed to have it run properly on web navigator Attached below is my code:
// WINCC:TAGNAME_SECTION_START
// syntax: #define TagNameInAction "DMTagName"
// next TagID : 1
// WINCC:TAGNAME_SECTION_END
#define TAG_M12_0312_Det2_Curve_Force_Live "M12_0312_Det2_Curve_Force_Test" // Force is an INT (2 Bytes)
#define TAG_M12_0312_Det2_Curve_Pos_Live "M12_0312_Det2_Curve_Pos_Test" // Position is an INT (2 Bytes)
//-------- Not Neccessary------------------
//#define nbByte_for_INT sizeof(int) //BYTE (default format for a raw tag )
#define nbByte_for_DINT sizeof(float) //BYTE (default format for a raw tag )
#define nbByte_for_REAL sizeof(long) //BYTE (default format for a raw tag )
#define nbSamples_Array 100 // Size of the arrays that contains Force and Position data curve analysis
#define szData_Force nbSamples_ArraynbByte_for_REAL // Force Values are REAL (4 Bytes)
#define szData_Position nbSamples_ArraynbByte_for_DINT // Position Values are DINT (4 Bytes)
//#define szData_Time nbSamples_ArraynbByte_for_DINT // TimeValues are DINT (4 Bytes)
//Declaration of Force and Position input arrays
float Force_2;
long Position_2;
double Force_Detail2[100];
double Position_Detail2[100];
unsigned int j;
unsigned int i;
unsigned int Null_Count_Force_2=0;
unsigned int Null_Count_Position_2=0;
static double ForceMax_Detail2;
static double PositionMax_Detail2;
// Creation of the BYTE array in which the values of the raw data tag are stored
BYTE byData_Force[szData_Force];
BYTE byData_Position[szData_Position];
GetTagRaw(TAG_M12_0312_Det2_Curve_Force_Live,byData_Force,szData_Force);
GetTagRaw(TAG_M12_0312_Det2_Curve_Pos_Live,byData_Position,szData_Position);
// Pointer to Raw Data Array
Force_2=&byData_Force[0];
Position_2=&byData_Position[0];
//Verification of actual values
ForceMax_Detail2==0;
for (i=0;i<100;i++)
{
Force_Detail2[i]=Force_2[i];
Position_Detail2[i]=Position_2[i];
//printf("%e , %e \r\n", Position_2[i],Force_Detail2[i]);
/ if (Force_Detail2[ i ] > ForceMax_Detail2)
{
ForceMax_Detail2 = Force_Detail2[ i ];
}
else
{
ForceMax_Detail2 = ForceMax_Detail2;
}
if (Position_Detail2[ i ] > PositionMax_Detail2)
{
PositionMax_Detail2=Position_Detail2[ i ];
}
else
{
PositionMax_Detail2=PositionMax_Detail2;
}
if (Force_Detail2[i]==0)
{
Null_Count_Force_2++;
}
if (Position_Detail2[i]==0)
{
Null_Count_Position_2++;
}
}
printf("\r\n Force Values are =\r\n");
for (j=0;j<100;j++)
{
printf("%e \r\n", Force_Detail2[j]);
}
printf("\r\n Position Values are =\r\n");
for (j=0;j<100;j++)
{
printf("%e \r\n", Position_Detail2[j]);
}
//Plot Graph
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","DeleteData",1);
SetPropWord(lpszPictureName,"BushingDet2CurveGraph","Index",0);
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","Online",FALSE); //
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","Activate",FALSE); //
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","ItemVisible",1);
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","AutoRangeX",0);
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","AutoRangeY",1);
SetPropDouble(lpszPictureName,"BushingDet2CurveGraph","BeginX",(Position_Detail2[0]/10000));//10000);
SetPropDouble(lpszPictureName,"BushingDet2CurveGraph","EndX",(PositionMax_Detail2/10000));//10000);
i=0;
for (i=0;i<100;i++)
{
if (Force_Detail2[ i]!= ForceMax_Detail2)
{
SetPropDouble(lpszPictureName,"BushingDet2CurveGraph","DataX",Position_Detail2[i]/10000);
SetPropDouble(lpszPictureName,"BushingDet2CurveGraph","DataY",Force_Detail2[i]);
//Return-Type:BOOL
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","InsertData",1);
}
else
{
break;
}
}
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","Online",TRUE);
SetPropBOOL(lpszPictureName,"BushingDet2CurveGraph","Activate",TRUE); //
}
}
以上就是关于如何用三菱PLC控制电气比例阀输出多段线性压力曲线全部的内容,包括:如何用三菱PLC控制电气比例阀输出多段线性压力曲线、简述plc程序编写过程、高分悬赏,请知道的高手帮忙,感激不尽!如何在wincc中根据设定的几个点绘制曲线,然后plc跟随这条曲线运等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)