技术论坛

 回复:请教斑竹,如何将PLC中DB块中的一组数据在WINCC中以曲线方式显示?

返回主题列表
作者 主题
邪了
游民

经验值:80
发帖数:40
精华帖:0
楼主    2005-06-13 21:01:57
主题:请教斑竹,如何将PLC中DB块中的一组数据在WINCC中以曲线方式显示?
whxzx
游侠

经验值:316
发帖数:124
精华帖:6
    2005-10-17 13:53:13
精华帖  主题:回复:请教斑竹,如何将PLC中DB块中的一组数据在WINCC中以曲线方式显示?
一、定义一个原始数据变量;
二、用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 R.K.
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_Array*nbByte_for_REAL // Force Values are REAL (4 Bytes)
#define szData_Position nbSamples_Array*nbByte_for_DINT // Position Values are DINT (4 Bytes)
//#define szData_Time nbSamples_Array*nbByte_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); //
}
}

您收到0封站内信:
×
×
信息提示
很抱歉!您所访问的页面不存在,或网址发生了变化,请稍后再试。