19995171010 发表于 2023-4-1 15:47:55

编写一个西门子1500PLC的模拟量转化程序


编写一个西门子1500PLC的模拟量转化程序,是将模拟量通道IW数值转化成浮点数工程量。信息如下
1,编程软件版本为博图V16
2,用SCL语言编写,程序是写在FB功能块中,变量在FB中建立,方便重复调用。
3,可以设置工程量上下限量程
4,符合博图编程规则

chatGPT_小智 发表于 2023-4-1 15:48:32

以下是一份基本的西门子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内部变量,它们用于计算工程量的值。具体计算方式是通过线性转换公式将读数转化为工程量值。

程序的实现很简单,我们首先计算了转换直线方程的斜率和偏移量,接着判断输入值是否超出了范围,如果超出了范围,则输出最大或最小工程量值。否则,我们使用线性转换公式来计算输出值。

19995171010 发表于 2023-4-1 15:49:39

chatGPT_小智 发表于 2023-4-1 15:48
以下是一份基本的西门子1500PLC模拟量转化程序,可根据需要进行修改和优化:



slope和offset内部变量是在TEMP中吗

chatGPT_小智 发表于 2023-4-1 15:49:56

在我上面提供的程序中,slope和offset是作为FB内部变量,在VAR块中定义的。这两个变量并不是在TEMP中声明的,因为他们是实现FB功能所需的中间变量,并不需要被外部程序使用。

但如果您需要在程序中定义临时变量,它们通常会在TEMP中声明。例如,如果我们需要在某个循环中使用一个计数器变量,可以使用TEMP来定义它。例如:

VAR_TEMP    iCount   : INT;      // Counter variableEND_VAR

此时,iCount变量就被定义为TEMP类型的内部变量,它只在当前程序执行期间存在,程序结束后就会被自动销毁。

19995171010 发表于 2023-4-1 15:55:04

chatGPT_小智 发表于 2023-4-1 15:49
在我上面提供的程序中,slope和offset是作为FB内部变量,在VAR块中定义的。这两个变量并不是在TEMP中声明的 ...

在此程序的基础上在加入高高限,高限,低低限,底限的设定值,并且输出报警信号

chatGPT_小智 发表于 2023-4-1 15:55:51

好的,以下是经过修改后的程序,已添加了高高限、高限、低低限、底限的设定,并在超出范围时输出报警信号: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。

19995171010 发表于 2023-4-1 15:56:52

chatGPT_小智 发表于 2023-4-1 15:55
好的,以下是经过修改后的程序,已添加了高高限、高限、低低限、底限的设定,并在超出范围时输出报警信号: ...

请像2楼那样的书写方式给我

chatGPT_小智 发表于 2023-4-1 15:57:27

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

19995171010 发表于 2023-4-1 16:00:04

chatGPT_小智 发表于 2023-4-1 15:57
FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog to Engineering Conversion with Alarm\'


VAR块是DB块?

chatGPT_小智 发表于 2023-4-1 16:00:20

不是。VAR块是在功能块(FC或FB)中使用的内部变量声明块,它可以用来定义输入、输出和中间变量。DB块(数据块)是一个独立于程序的数据存储区域,可以在多个程序中使用,其中包含变量、数组、用户定义类型等。虽然它们都可以被用来存储变量,但是它们的作用范围和使用方式是不同的。在上面的程序中,我们使用VAR块来定义了输入变量、输出变量和中间变量,而没有使用DB块。
页: [1] 2
查看完整版本: 编写一个西门子1500PLC的模拟量转化程序