Li123456 发表于 2023-4-13 12:31:33

组态王编程


IF(\\local\A1罐_状态 ==0)
   { \\local\A1_State="1待机";}
else IF
(\\local\A1罐_状态 ==1)
   { \\local\A1_State="2_1灌水准备";}
else IF
(\\local\A1罐_状态 ==2)
   { \\local\A1_State="2_2排气";}
else IF
(\\local\A1罐_状态 ==3)
   { \\local\A1_State="3正冲洗";}
else IF
(\\local\A1罐_状态 ==4)
   { \\local\A1_State="4过滤";}
else IF
(\\local\A1罐_状态 ==5)
   { \\local\A1_State="5_1反洗准备";}
else IF
(\\local\A1罐_状态 ==6)
   { \\local\A1_State="5_2水反洗";}
else IF
(\\local\A1罐_状态 ==7)
   { \\local\A1_State="5_3水气混洗";}
else IF
(\\local\A1罐_状态 ==8)
   { \\local\A1_State="6_1静止";}
else IF
(\\local\A1罐_状态 ==9)
   { \\local\A1_State="6_2排水";}
else IF
(\\local\A1罐_状态 ==10)
   { \\local\A1_State="6_3气擦洗";}
else IF
(\\local\A1罐_状态 == 11)
   { \\local\A1_State="7_1停";}
else IF
(\\local\A1罐_状态 == 12)
   { \\local\A1_State="7_2水反洗";}
else IF
(\\local\A1罐_状态 == 13)
   { \\local\A1_State="7_3停机";}
else IF
(\\local\A1罐_状态 ==14)
   { \\local\A1_State="8_1进药";}
else IF
(\\local\A1罐_状态 ==15)
   { \\local\A1_State="8_2浸泡";}
else IF
(\\local\A1罐_状态 ==16)
   { \\local\A1_State="8_3排药";}
else IF
(\\local\A1罐_状态 == 17)
   { \\local\A1_State="9_1反洗准备";}
else IF
(\\local\A1罐_状态 == 18)
   { \\local\A1_State="9_2水反洗";}
else IF
(\\local\A1罐_状态 == 19)
   { \\local\A1_State="9_3水气混洗";}
else IF
(\\local\A1罐_状态 == 20)
   { \\local\A1_State="10_1静止";}
else IF
(\\local\A1罐_状态 == 21)
   { \\local\A1_State="10_2排水";}
else IF
(\\local\A1罐_状态 == 22)
   { \\local\A1_State="10_3气擦洗";}
else IF
(\\local\A1罐_状态 == 23)
   { \\local\A1_State="11_1停";}
else IF
(\\local\A1罐_状态 == 24)
   { \\local\A1_State="11_2水反洗";}
else IF
(\\local\A1罐_状态 == 25)
   { \\local\A1_State="11_3气擦洗";}
else IF
(\\local\A1罐_状态 == 26)
   { \\local\A1_State="12_1静止";}
else IF
(\\local\A1罐_状态 == 27)
   { \\local\A1_State="12_2排水";}
else IF
(\\local\A1罐_状态 == 28)
   { \\local\A1_State="12_2气擦洗";}
else IF
(\\local\A1罐_状态 == 29)
   { \\local\A1_State="13正冲";}
else
{ \\local\A1_State="超限";}用组态王7.5SP5
有更简洁的方式吗

chatGPT_小智 发表于 2023-4-13 12:33:44

可以使用switch语句来简化代码:

switch(\\local\A1罐_状态) {
case 0: \\local\A1_State="1待机"; break;
case 1: \\local\A1_State="2_1灌水准备"; break;
case 2: \\local\A1_State="2_2排气"; break;
case 3: \\local\A1_State="3正冲洗"; break;
case 4: \\local\A1_State="4过滤"; break;
case 5: \\local\A1_State="5_1反洗准备"; break;
case 6: \\local\A1_State="5_2水反洗"; break;
case 7: \\local\A1_State="5_3水气混洗"; break;
case 8: \\local\A1_State="6_1静止"; break;
case 9: \\local\A1_State="6_2排水"; break;
case 10: \\local\A1_State="6_3气擦洗"; break;
case 11: \\local\A1_State="7_1停"; break;
case 12: \\local\A1_State="7_2水反洗"; break;
case 13: \\local\A1_State="7_3停机"; break;
case 14: \\local\A1_State="8_1进药"; break;
case 15: \\local\A1_State="8_2浸泡"; break;
case 16: \\local\A1_State="8_3排药"; break;
case 17: \\local\A1_State="9_1反洗准备"; break;
case 18: \\local\A1_State="9_2水反洗"; break;
case 19: \\local\A1_State="9_3水气混洗"; break;
case 20: \\local\A1_State="10_1静止"; break;
case 21: \\local\A1_State="10_2排水"; break;
case 22: \\local\A1_State="10_3气擦洗"; break;
case 23: \\local\A1_State="11_1停"; break;
case 24: \\local\A1_State="11_2水反洗"; break;
case 25: \\local\A1_State="11_3气擦洗"; break;
case 26: \\local\A1_State="12_1静止"; break;
case 27: \\local\A1_State="12_2排水"; break;
case 28: \\local\A1_State="12_2气擦洗"; break;
case 29: \\local\A1_State="13正冲"; break;
default: \\local\A1_State="超限"; break;
}

此代码使用switch语句,以\\local\A1罐_状态作为选项。如果\\local\A1罐_状态在0到29之间,则设置\\local\A1_State对应的值。如果状态超出此范围,则将\\local\A1_State设置为"超限"。

Li123456 发表于 2023-4-13 12:37:05

还有其他方式呢?

chatGPT_小智 发表于 2023-4-13 12:38:26

Li123456 发表于 2023-04-13 12:37
还有其他方式呢?

可以使用数组和索引来简化代码:
// 定义状态数组
string states[] = { "1待机", "2_1灌水准备", "2_2排气", "3正冲洗", "4过滤", "5_1反洗准备", "5_2水反洗", "5_3水气混洗", "6_1静止",
                  "6_2排水", "6_3气擦洗", "7_1停", "7_2水反洗", "7_3停机", "8_1进药", "8_2浸泡", "8_3排药", "9_1反洗准备",
                  "9_2水反洗", "9_3水气混洗", "10_1静止", "10_2排水", "10_3气擦洗", "11_1停", "11_2水反洗", "11_3气擦洗",
                  "12_1静止", "12_2排水", "12_2气擦洗", "13正冲", "超限" };

int index = \\local\A1罐_状态; // 获取状态索引
\\local\A1_State = index >= 0 && index < 30 ? states : states; // 设置对应的状态值,如果超出范围,则设置为“超限”

此代码使用一个字符串数组来存储所有的状态值。然后使用\\local\A1罐_状态作为索引,并通过判断该索引是否在0~29之间来设置\\local\A1_State的值。如果超出此范围,则设置\\local\A1_State为“超限”。

Li123456 发表于 2023-4-13 12:48:18

要求应用在软件组态王7.5 SP5

chatGPT_小智 发表于 2023-4-13 12:48:47

Li123456 发表于 2023-04-13 12:48
要求应用在软件组态王7.5 SP5

在组态王7.5 SP5中,你可以使用定义常量的方式来代替数组:

// 定义常量const string STATE_0 = "1待机";const string STATE_1 = "2_1灌水准备";const string STATE_2 = "2_2排气";const string STATE_3 = "3正冲洗";const string STATE_4 = "4过滤";const string STATE_5 = "5_1反洗准备";const string STATE_6 = "5_2水反洗";const string STATE_7 = "5_3水气混洗";const string STATE_8 = "6_1静止";const string STATE_9 = "6_2排水";const string STATE_10 = "6_3气擦洗";const string STATE_11 = "7_1停";

Li123456 发表于 2023-4-13 14:59:37

软件西门博图v16;写一个模拟量转换FB程序

chatGPT_小智 发表于 2023-4-13 15:00:29

Li123456 发表于 2023-04-13 14:59
软件西门博图v16;写一个模拟量转换FB程序 ...

在西门博图v16中,你可以按照以下步骤来编写模拟量转换FB程序:

1. 创建一个新的FB,在工程画面的“类型定义”中选择“标准函数块”,然后在弹出的菜单中选择“FUNCTION_BLOCK”。

2. 为FB指定名称,并定义输入和输出参数。例如,你可以声明两个输入参数ANALOG_IN和ANALOG_TYPE,以及一个输出参数ANALOG_OUT。

3. 编写程序代码,将输入的模拟量转换为所需的类型。以下是一个示例程序:

FUNCTION_BLOCK ANALOG_CONVERTER
VAR_INPUT
    ANALOG_IN: REAL;
    ANALOG_TYPE: STRING(10);
END_VAR
VAR_OUTPUT
    ANALOG_OUT: REAL;
END_VAR

CASE ANALOG_TYPE OF
    'VOLTAGE': ANALOG_OUT := ANALOG_IN * 1000; // 将输入值转换为毫伏
    'CURRENT': ANALOG_OUT := ANALOG_IN * 100; // 将输入值转换为毫安
    ELSE ANALOG_OUT := 0; // 如果不是已知类型,则输出0
END_CASE
END_FUNCTION_BLOCK

4. 在需要使用该FB的程序中调用该FB,并传递所需的输入参数。例如,假设需要将一个电流信号转换为毫安输出,可以按以下方式调用FB:

ANALOG_CONVERTER(ANALOG_IN:= 5.5, ANALOG_TYPE:= 'CURRENT', ANALOG_OUT=> myOutput);

其中,5.5是输入的电流值,'CURRENT'表示需要将其转换为毫安,而myOutput则是输出的结果变量。

Li123456 发表于 2023-4-13 15:02:11

软件西门博图v16;写一个4-20MA转换为浮点数模拟量转换FB程序

chatGPT_小智 发表于 2023-4-13 15:03:35

Li123456 发表于 2023-04-13 15:02
软件西门博图v16;写一个4-20MA转换为浮点数模拟量转 ...

在西门博图v16中,你可以按照以下步骤来编写4-20MA转换为浮点数模拟量转换FB程序:

1.创建一个新的FB,在工程画面的“类型定义”中选择“标准函数块”,然后在弹出的菜单中选择“FUNCTION_BLOCK”。

2.为FB指定名称,并定义输入和输出变量。输入变量包括:AI(模拟量输入,单位:mA),上下限值(最小值和最大值),输出变量为AO(模拟量输出,单位:mV)。

3.在FB中添加代码以将输入变量转换为模拟量输出值。可以使用以下公式:AO = (AI - 4) / 16 * (上限值 - 下限值) + 下限值。这个公式会将 4-20mA 的电流信号转换为浮点数模拟量信号。注意,在输出变量 AO 的数据类型应该设置为 Real。

4.保存并编译 FB 程序。

FB程序代码示例:

FUNCTION_BLOCK AI_TO_AO
VAR_INPUT
AI: REAL; // 模拟量输入,单位:mA
LowerLimit: REAL; // 下限值
UpperLimit: REAL; // 上限值
END_VAR
VAR_OUTPUT
AO: REAL; // 模拟量输出,单位:mV
END_VAR
VAR_TEMP
fRange : REAL; // 输出范围
END_VAR

fRange := UpperLimit - LowerLimit;
AO := (AI - 4) / 16 * fRange + LowerLimit;

注意:此示例中的计算仅适用于 4-20mA 到 mV 的转换,如果需要将 mA 转换为其他计量单位,建议修改公式中的系数即可。
页: [1] 2
查看完整版本: 组态王编程