编写一个西门子1500PLC的模拟量转化程序
编写一个西门子1500PLC的模拟量转化程序,是将模拟量通道IW数值转化成浮点数工程量。信息如下
1,编程软件版本为博图V16
2,用SCL语言编写,程序是写在FB功能块中,变量在FB中建立,方便重复调用。
3,可以设置工程量上下限量程
4,符合博图编程规则
以下是一份基本的西门子1500PLC模拟量转化程序,可根据需要进行修改和优化:
FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog to Engineering Conversion\'
// Input variables
VAR_INPUT
iwValue : INT; // IW input value
fMinValue: REAL; // Engineering minimum value
fMaxValue: REAL; // Engineering maximum value
iMinValue: INT; // Raw minimum value
iMaxValue: INT; // Raw maximum value
END_VAR
// Output variables
VAR_OUTPUT
fEngValue: REAL; // Engineering output value
END_VAR
// Internal variables
VAR
slope : REAL; // Slope of the conversion linear equation
offset : REAL; // Offset of the conversion linear equation
END_VAR
// Implementation
BEGIN
slope:= (fMaxValue - fMinValue) / (iMaxValue - iMinValue);
offset := fMinValue - slope * iMinValue;
IF iwValue <= iMinValue THEN
fEngValue := fMinValue;
ELSIF iwValue >= iMaxValue THEN
fEngValue := fMaxValue;
ELSE
fEngValue := slope * iwValue + offset;
END_IF;
END_FUNCTION_BLOCK
在此程序中,我们首先定义了输入和输出变量。输入变量包括IW信号的数值、工程量的最小和最大值以及原始量的最小和最大值。输出变量为转化后的工程量数值。
我们还定义了slope和offset内部变量,它们用于计算工程量的值。具体计算方式是通过线性转换公式将读数转化为工程量值。
程序的实现很简单,我们首先计算了转换直线方程的斜率和偏移量,接着判断输入值是否超出了范围,如果超出了范围,则输出最大或最小工程量值。否则,我们使用线性转换公式来计算输出值。 chatGPT_小智 发表于 2023-4-1 15:48
以下是一份基本的西门子1500PLC模拟量转化程序,可根据需要进行修改和优化:
slope和offset内部变量是在TEMP中吗 在我上面提供的程序中,slope和offset是作为FB内部变量,在VAR块中定义的。这两个变量并不是在TEMP中声明的,因为他们是实现FB功能所需的中间变量,并不需要被外部程序使用。
但如果您需要在程序中定义临时变量,它们通常会在TEMP中声明。例如,如果我们需要在某个循环中使用一个计数器变量,可以使用TEMP来定义它。例如:
VAR_TEMP iCount : INT; // Counter variableEND_VAR
此时,iCount变量就被定义为TEMP类型的内部变量,它只在当前程序执行期间存在,程序结束后就会被自动销毁。 chatGPT_小智 发表于 2023-4-1 15:49
在我上面提供的程序中,slope和offset是作为FB内部变量,在VAR块中定义的。这两个变量并不是在TEMP中声明的 ...
在此程序的基础上在加入高高限,高限,低低限,底限的设定值,并且输出报警信号 好的,以下是经过修改后的程序,已添加了高高限、高限、低低限、底限的设定,并在超出范围时输出报警信号:FUNCTION_BLOCK AnalogConversionTITLE = \\\'Analog to Engineering Conversion with Alarm\\\'// Input variablesVAR_INPUT iwValue : INT; // IW input value fMinValue : REAL; // Engineering minimum value fMaxValue : REAL; // Engineering maximum value iMinValue : INT; // Raw minimum value iMaxValue : INT; // Raw maximum value fHighHighLimit: REAL; // High-high limit fHighLimit : REAL; // High limit fLowLowLimit : REAL; // Low-low limit fLowLimit : REAL; // Low limitEND_VAR// Output variablesVAR_OUTPUT fEngValue : REAL; // Engineering output value bAlarm : BOOL; // Alarm signalEND_VAR// Internal variablesVAR slope : REAL; // Slope of the conversion linear equation offset : REAL; // Offset of the conversion linear equationEND_VAR// ImplementationBEGIN slope:= (fMaxValue - fMinValue) / (iMaxValue - iMinValue); offset := fMinValue - slope * iMinValue; IF iwValue <= iMinValue THEN fEngValue := fMinValue; bAlarm := TRUE; ELSIF iwValue >= iMaxValue THEN fEngValue := fMaxValue; bAlarm := TRUE; ELSE fEngValue := slope * iwValue + offset; IF fEngValue > fHighHighLimit THEN bAlarm := TRUE; ELSIF fEngValue > fHighLimit THEN bAlarm := FALSE; ELSIF fEngValue < fLowLowLimit THEN bAlarm := TRUE; ELSIF fEngValue < fLowLimit THEN bAlarm := FALSE; ELSE bAlarm := FALSE; END_IF; END_IF;END_FUNCTION_BLOCK 在这个程序中,我们新增了以下输入变量:fHighHighLimit,fHighLimit,fLowLowLimit和fLowLimit,分别表示高高限、高限、低低限和底限的设定值。我们还添加了一个布尔类型的输出变量bAlarm,用于表示报警信号。 程序实现方式基本与之前相同。当输入值超出范围时,我们不仅将bAlarm置为TRUE,还将fEngValue设置为最大或最小工程量值;当值在范围内时,我们通过线性转换公式计算fEngValue,然后判断它是否超出设定范围。如果超出了范围,则将bAlarm设置为TRUE;否则,将其设置为FALSE。 chatGPT_小智 发表于 2023-4-1 15:55
好的,以下是经过修改后的程序,已添加了高高限、高限、低低限、底限的设定,并在超出范围时输出报警信号: ...
请像2楼那样的书写方式给我 FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog to Engineering Conversion with Alarm\'
// Input variables
VAR_INPUT
iwValue : INT; // IW input value
fMinValue : REAL; // Engineering minimum value
fMaxValue : REAL; // Engineering maximum value
iMinValue : INT; // Raw minimum value
iMaxValue : INT; // Raw maximum value
fHighHighLimit: REAL; // High-high limit
fHighLimit : REAL; // High limit
fLowLowLimit : REAL; // Low-low limit
fLowLimit : REAL; // Low limit
END_VAR
// Output variables
VAR_OUTPUT
fEngValue : REAL; // Engineering output value
bAlarm : BOOL; // Alarm signal
END_VAR
// Internal variables
VAR
slope : REAL; // Slope of the conversion linear equation
offset : REAL; // Offset of the conversion linear equation
END_VAR
// Implementation
BEGIN
slope:= (fMaxValue - fMinValue) / (iMaxValue - iMinValue);
offset := fMinValue - slope * iMinValue;
IF iwValue <= iMinValue THEN
fEngValue := fMinValue;
bAlarm := TRUE;
ELSIF iwValue >= iMaxValue THEN
fEngValue := fMaxValue;
bAlarm := TRUE;
ELSE
fEngValue := slope * iwValue + offset;
IF fEngValue > fHighHighLimit THEN
bAlarm := TRUE;
ELSIF fEngValue > fHighLimit THEN
bAlarm := FALSE;
ELSIF fEngValue < fLowLowLimit THEN
bAlarm := TRUE;
ELSIF fEngValue < fLowLimit THEN
bAlarm := FALSE;
ELSE
bAlarm := FALSE;
END_IF;
END_IF;
END_FUNCTION_BLOCK chatGPT_小智 发表于 2023-4-1 15:57
FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog to Engineering Conversion with Alarm\'
VAR块是DB块? 不是。VAR块是在功能块(FC或FB)中使用的内部变量声明块,它可以用来定义输入、输出和中间变量。DB块(数据块)是一个独立于程序的数据存储区域,可以在多个程序中使用,其中包含变量、数组、用户定义类型等。虽然它们都可以被用来存储变量,但是它们的作用范围和使用方式是不同的。在上面的程序中,我们使用VAR块来定义了输入变量、输出变量和中间变量,而没有使用DB块。
页:
[1]
2