最新提现记录

  • 恭喜 admin 于 2023-6-6 15:17 成功提现 500元
  • 恭喜 admin 于 2023-5-3 09:45 成功提现 400元

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

[复制链接]
查看5445 | 回复19 | 2023-4-1 15:47:55 | 显示全部楼层 |阅读模式
[table]
[tr][td]编写一个西门子1500PLC的模拟量转化程序,是将模拟量通道IW数值转化成浮点数工程量。信息如下
1,编程软件版本为博图V16
2,用SCL语言编写,程序是写在FB功能块中,变量在FB中建立,方便重复调用。
3,可以设置工程量上下限量程
4,符合博图编程规则[/td][/tr]
[/table]
回复

使用道具 举报

chatGPT_小智 | 2023-4-1 15:48:32 | 显示全部楼层
以下是一份基本的西门子1500PLC模拟量转化程序,可根据需要进行修改和优化:

[code]
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
[/code]

在此程序中,我们首先定义了输入和输出变量。输入变量包括IW信号的数值、工程量的最小和最大值以及原始量的最小和最大值。输出变量为转化后的工程量数值。

我们还定义了slope和offset内部变量,它们用于计算工程量的值。具体计算方式是通过线性转换公式将读数转化为工程量值。

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

使用道具 举报

19995171010 | 2023-4-1 15:49:39 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2202&ptid=1144][color=#999999]chatGPT_小智 发表于 2023-4-1 15:48[/color][/url][/size]
以下是一份基本的西门子1500PLC模拟量转化程序,可根据需要进行修改和优化:

[/quote]

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 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2204&ptid=1144][color=#999999]chatGPT_小智 发表于 2023-4-1 15:49[/color][/url][/size]
在我上面提供的程序中,slope和offset是作为FB内部变量,在VAR块中定义的。这两个变量并不是在TEMP中声明的 ...[/quote]

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

使用道具 举报

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 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2206&ptid=1144][color=#999999]chatGPT_小智 发表于 2023-4-1 15:55[/color][/url][/size]
好的,以下是经过修改后的程序,已添加了高高限、高限、低低限、底限的设定,并在超出范围时输出报警信号: ...[/quote]

请像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 | 显示全部楼层
[quote][size=2][url=forum.php?mod=redirect&goto=findpost&pid=2208&ptid=1144][color=#999999]chatGPT_小智 发表于 2023-4-1 15:57[/color][/url][/size]
FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog to Engineering Conversion with Alarm\'
[/quote]

VAR块是DB块?
回复

使用道具 举报

chatGPT_小智 | 2023-4-1 16:00:20 | 显示全部楼层
不是。VAR块是在功能块(FC或FB)中使用的内部变量声明块,它可以用来定义输入、输出和中间变量。DB块(数据块)是一个独立于程序的数据存储区域,可以在多个程序中使用,其中包含变量、数组、用户定义类型等。虽然它们都可以被用来存储变量,但是它们的作用范围和使用方式是不同的。在上面的程序中,我们使用VAR块来定义了输入变量、输出变量和中间变量,而没有使用DB块。
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则