最新提现记录

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

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

[复制链接]
查看7513 | 回复25 | 2023-3-31 16:29:18 | 显示全部楼层 |阅读模式
编写一个西门子1500PLC的模拟量转化程序,是将模拟量通道IW数值转化成浮点数工程量。信息如下
1,编程软件版本为博图V17
2,用SCL语言编写,程序是写在FB功能块中。
3,可以设置工程量上下限量程
4,吖符合博图编程规则
回复

使用道具 举报

chatGPT_小控 | 2023-3-31 16:30:11 | 显示全部楼层
好的,根据您提供的信息,以下是一个基本的模拟量转化程序, 使用SCL语言编写并写在FB功能块中,适用于西门子1500PLC,并且符合博图V17编程规则。

FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog Conversion\'
VERSION : INT := 1; // 版本号

// 输入参数
IN_PARA :
STRUCT
    AI : INT; // 模拟量通道IW数值
    LOWER_LIMIT : REAL; // 工程量下限
    UPPER_LIMIT : REAL; // 工程量上限
END_STRUCT;

// 输出参数
OUT_PARA :
STRUCT
    AO : REAL; // 浮点数工程量
END_STRUCT;

VAR_INPUT
    IN_PARA : IN_PARA;
END_VAR

VAR_OUTPUT
    OUT_PARA : OUT_PARA;
END_VAR

VAR_TEMP
    Temp : REAL; // 临时变量
END_VAR

// FB实现
BEGIN
    // 将IW数值进行归一化处理到0-1范围内
    Temp := ((IN_PARA.AI - 0) / (32767 - 0));

    // 根据范围计算浮点数工程量
    OUT_PARA.AO := IN_PARA.LOWER_LIMIT + (Temp * (IN_PARA.UPPER_LIMIT - IN_PARA.LOWER_LIMIT));
END_FUNCTION_BLOCK

使用方法:
1. 创建一个新的SCL程序并打开FB编辑器
2. 将以上代码复制并黏贴至FB编辑器中
3. 按需修改工程量上下限量程
4. 保存并编译程序,在主程序中调用该FB实现模拟量转化功能
回复

使用道具 举报

19995171010 | 2023-3-31 16:49:35 | 显示全部楼层
以上程序需要在DB块中建立变量吗?
回复

使用道具 举报

chatGPT_小控 | 2023-3-31 16:50:07 | 显示全部楼层
是的,以上程序需要在DB块中建立变量。在FB功能块中有输入和输出参数,在DB块中定义这些参数,在主程序中调用FB时将其传递给FB。以下是一个示例DB块:DATABASE AnalogConversionDBVERSION : INT := 1; // 版本号// 定义输入参数结构体STRUCT    AI : INT; // 模拟量通道IW数值    LOWER_LIMIT : REAL; // 工程量下限    UPPER_LIMIT : REAL; // 工程量上限END_STRUCT; // 命名为IN_PARA// 定义输出参数结构体STRUCT    AO : REAL; // 浮点数工程量END_STRUCT; // 命名为OUT_PARA// 定义DB块变量VAR    IN_PARA : IN_PARA; // 输入参数变量    OUT_PARA : OUT_PARA; // 输出参数变量END_VAREND_DBJust like in the FB code, the input and output parameters are defined as structures. In this example, they are named \"IN_PARA\" and \"OUT_PARA\". You can modify the variable names to match your own naming convention. Once you have defined the variables in the DB block, you can call the FB in your main program and pass the input and output variables as parameters.
回复

使用道具 举报

19995171010 | 2023-3-31 16:51:58 | 显示全部楼层
可以改写在FB功能块的Input ,Output等输入输出参数,方便重复调用
回复

使用道具 举报

chatGPT_小控 | 2023-3-31 16:52:41 | 显示全部楼层
是的,您可以通过改写FB功能块的输入输出参数来方便地重复调用该FB。以下是一个示例代码, 基于先前的代码并进行了修改:FUNCTION_BLOCK AnalogConversion // 将IN_PARA和OUT_PARA作为输入输出参数TITLE = \\\'Analog Conversion\\\'VERSION : INT := 1; // 版本号// 输入参数AI : INT; // 模拟量通道IW数值LOWER_LIMIT : REAL; // 工程量下限UPPER_LIMIT : REAL; // 工程量上限// 输出参数AO : REAL; // 浮点数工程量// FB实现BEGIN    // 将AI数值进行归一化处理到0-1范围内    Temp := ((AI - 0) / (32767 - 0));    // 根据范围计算浮点数工程量    AO := LOWER_LIMIT + (Temp * (UPPER_LIMIT - LOWER_LIMIT));END_FUNCTION_BLOCK在这个修改后的代码中,FB功能块的输入输出参数被直接声明在函数块外部,而不需要用结构体去定义,这样可以简化程序,并且使得代码更易读。使用方法与之前相同,只需将输入和输出变量分别传递到FB中即可。
回复

使用道具 举报

19995171010 | 2023-3-31 16:56:44 | 显示全部楼层
可以给一份完整的程序,并且在增加浮点数工程量高高限,高限,低低限,低限的报警设定和输出
回复

使用道具 举报

chatGPT_小控 | 2023-3-31 16:58:26 | 显示全部楼层
好的,下面是一份完整的程序,包括模拟量转化功能以及工程量上下限报警设定和输出。该程序适用于西门子1500PLC,使用SCL语言编写,并符合博图V17编程规则。DB块的变量定义如下:DATABASE AnalogConversionDBVERSION : INT := 1; // 版本号// 输入参数结构体STRUCT    AI : INT; // 模拟量通道IW数值END_STRUCT; // 命名为IN_PARA// 输出参数结构体STRUCT    AO : REAL; // 浮点数工程量    HIGH_HIGH_LIMIT : REAL; // 高高限    HIGH_LIMIT : REAL; // 高限    LOW_LOW_LIMIT: REAL; // 低低限    LOW_LIMIT : REAL; // 低限    ALARM : BOOL; // 报警信号END_STRUCT; // 命名为OUT_PARA// 定义DB块变量VAR    IN_PARA : IN_PARA; // 输入参数变量    OUT_PARA : OUT_PARA; // 输出参数变量    Temp : REAL; // 临时变量END_VAREND_DB下面是FB功能块代码:FUNCTION_BLOCK AnalogConversionTITLE = \\\'Analog Conversion\\\'VERSION : INT := 1; // 版本号// 输入参数AI : INT; // 模拟量通道IW数值LOWER_LIMIT : REAL; // 工程量下限UPPER_LIMIT : REAL; // 工程量上限HIGH_HIGH_LIMIT : REAL; // 高高限HIGH_LIMIT : REAL; // 高限LOW_LOW_LIMIT : REAL; // 低低限LOW_LIMIT : REAL; // 低限// 输出参数AO : REAL; // 浮点数工程量ALARM : BOOL; // 报警信号// FB实现BEGIN    // 将AI数值进行归一化处理到0-1范围内    Temp := ((AI - 0) / (32767 - 0));    // 根据范围计算浮点数工程量    AO := LOWER_LIMIT + (Temp * (UPPER_LIMIT - LOWER_LIMIT));    // 检查是否超出高高限,以及低低限    ALARM := (AO > HIGH_HIGH_LIMIT) OR (AO < LOW_LOW_LIMIT);    // 检查是否超出高限    IF NOT ALARM AND (AO > HIGH_LIMIT) THEN        // 超出高限,设置报警信号为TRUE        ALARM := TRUE;    END_IF    // 检查是否超出低限    IF NOT ALARM AND (AO < LOW_LIMIT) THEN        // 超出低限,设置报警信号为TRUE        ALARM := TRUE;    END_IFEND_FUNCTION_BLOCK最后,下面是主程序的示例代码,展示了如何调用上述FB功能块并输出结果到控制台。PROGRAM MainProgramVAR    AnalogData : AnalogConversionDB; // 定义AnalogConversionDB变量END_VAR// 主程序开始    // 初始化AnalogConversionDB变量    AnalogData.IN_PARA.AI := 16384; // 假设模拟量通道IW数值为16384    AnalogData.OUT_PARA.LOWER_LIMIT := 0.0;    AnalogData.OUT_PARA.UPPER_LIMIT := 100.0;    AnalogData.OUT_PARA.HIGH_HIGH_LIMIT := 110.0;    AnalogData.OUT_PARA.HIGH_LIMIT := 90.0;    AnalogData.OUT_PARA.LOW_LOW_LIMIT := -10.0;    AnalogData.OUT_PARA.LOW_LIMIT := 10.0;    // 调用AnalogConversion FB功能块    AnalogConversion(IN:=AnalogData.IN_PARA, OUT=>AnalogData.OUT_PARA);    // 输出浮点数工程量和报警信号到控制台    WRITE(\\\'Analog Conversion Result: \\\', AnalogData.OUT_PARA.AO);    IF AnalogData.OUT_PARA.ALARM THEN        WRITE(\\\' Alarm!\\\');    ELSE        WRITE(\\\' OK\\\');    END_IF;END_PROGRAM
回复

使用道具 举报

19995171010 | 2023-3-31 17:01:51 | 显示全部楼层
这个太混乱了,可以像2楼那样写出来吗?不要在DB中建立变量,直接在FB块的Input,Output等中建立变量
回复

使用道具 举报

chatGPT_小控 | 2023-3-31 17:03:08 | 显示全部楼层
好的,以下是一份完整的程序,包括模拟量转换以及工程量上下限报警设定和输出。该程序适用于西门子1500PLC,使用SCL语言编写,并符合博图V17编程规则。

[code]
FUNCTION_BLOCK AnalogConversion
TITLE = \'Analog Conversion\'

// 输入参数
VAR_INPUT
    inPara : INT; // 模拟量通道IW数值
    highHighLimit : REAL; // 工程量高高限
    highLimit : REAL; // 工程量高限
    lowLowLimit : REAL; // 工程量低低限
    lowLimit : REAL; // 工程量低限
END_VAR

// 输出参数
VAR_OUTPUT
    outPara : REAL; // 转换后的工程量
    alarmHH : BOOL; // 高高限报警
    alarmH : BOOL; // 高限报警
    alarmLL : BOOL; // 低低限报警
    alarmL : BOOL; // 低限报警
END_VAR

// 内部变量
VAR
    rawValue : INT; // 原始值
    slope : REAL := 0.01; // 斜率
    intercept : REAL := 0.0; // 截距
    hhLimit : REAL; // 实际高高限
    hLimit : REAL; // 实际高限
    llLimit : REAL; // 实际低低限
    lLimit : REAL; // 实际低限
END_VAR

// FB主体
BEGIN
    // 强制在量程内
    rawValue := MAX(MIN(inPara, 32767), -32768);
   
    // 转换为工程量
    outPara := slope * rawValue + intercept;
   
    // 判断是否超出限制范围
    hhLimit := highHighLimit;
    hLimit := highLimit;
    llLimit := lowLowLimit;
    lLimit := lowLimit;
   
    IF outPara > hhLimit THEN
        alarmHH := TRUE;
        alarmH := FALSE;
        alarmLL := FALSE;
        alarmL := FALSE;
    ELSIF outPara > hLimit THEN
        alarmHH := FALSE;
        alarmH := TRUE;
        alarmLL := FALSE;
        alarmL := FALSE;
    ELSIF outPara < llLimit THEN
        alarmHH := FALSE;
        alarmH := FALSE;
        alarmLL := TRUE;
        alarmL := FALSE;
    ELSIF outPara < lLimit THEN
        alarmHH := FALSE;
        alarmH := FALSE;
        alarmLL := FALSE;
        alarmL := TRUE;
    ELSE
        alarmHH := FALSE;
        alarmH := FALSE;
        alarmLL := FALSE;
        alarmL := FALSE;
    END_IF;
END_FUNCTION_BLOCK
[/code]

在该FB中,我们直接在输入和输出参数中定义变量,并在FB主体中使用它们来完成模拟量转换和报警设定。
回复

使用道具 举报

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

本版积分规则