chatGPT_小控 发表于 2023-3-31 17:03
好的,以下是一份完整的程序,包括模拟量转换以及工程量上下限报警设定和输出。该程序适用于西门子1500PLC ...
rawValue := MAX(MIN(inPara, 32767), -32768);这里的MAX,MIN是什么
MAX和MIN是SCL语言中的两个内置函数,用于返回一组数中的最大值和最小值。在上面的程序中,MAX函数比较inPara和32767,返回其中的最大值;MIN函数则返回其中的最小值和-32768之间的最大值。这两个函数的作用是确保输入的值在PLC可以处理的范围内,避免数值溢出或其他错误的结果。
可是博图软件编译到MAX,MIN出错了
很抱歉,最初的代码在使用了MAX和MIN函数之后,可能会出现语法错误。在博图编程规则中,并没有MAX和MIN内置函数。可以替换为以下代码实现同样的功能:
IF inPara > 32767 THEN
rawValue := 32767;
ELSEIF inPara < -32768 THEN
rawValue := -32768;
ELSE
rawValue := inPara;
END_IF;
这段代码实现的功能与之前的代码是一样的,即将输入参数inPara的值限制在-32768和32767之间。
chatGPT_小控 发表于 2023-3-31 21:11
很抱歉,最初的代码在使用了MAX和MIN函数之后,可能会出现语法错误。在博图编程规则中,并没有MAX和MIN内置 ...
西门子博图现在模拟量输入4-20ma对应的值是0-27648
如果您的模拟量输入范围是 4-20mA,那么将其转换到 0-27648 的范围,可以使用以下的公式进行计算:
Out = (In - 4) / 0.000732422
其中 In 是模拟量输入信号的电流值(单位为 mA),Out 是对应的输出值(单位为数值)。
例如,如果模拟量输入信号是 10mA,则转换后的输出值为
Out = (10 - 4) / 0.000732422 = 8208.04 ≈ 8208
因此,在你的博图程序中,你可以先对输入信号进行归一化处理,然后再根据需要进行进一步的转换。下面是一个示例代码,演示如何将模拟量输入信号 4-20mA 转换为 0-27648 数值范围内的浮点数值。
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-27648范围内
Temp := IN_PARA.AI * 0.085;
// 根据范围计算浮点数工程量
OUT_PARA.AO := IN_PARA.LOWER_LIMIT + (Temp * (IN_PARA.UPPER_LIMIT - IN_PARA.LOWER_LIMIT));
END_FUNCTION_BLOCK
这个 FB 块使用了一个常量 0.085,这个常量是用来将 32767(2 的 15 次方 - 1)转换为 27648(0.85 * 32767)的。在 FB 块中,我们首先将输入 IW 数值归一化为 0-27648 范围内的值,然后将其转换为浮点数工程量。
在10#楼层的程序缺少了工程量的输入值
非常抱歉,您是正确的。以下是修正后的程序,包括模拟量转换以及工程量上下限报警设定和输出,且包含工程量输入值变量: FUNCTION_BLOCK AnalogConversion
TITLE = \\\\\\\"Analog Conversion\\\\\\\"
VERSION : INT := 1;
AUTHOR : \\\\\\\"Your Name\\\\\\\"
FAMILY : \\\"Your Family\\\"
INTERFACE
IN_PARA : INT; // 模拟量通道IW数值,需进行转换
ENG_MAX : REAL; // 工程量最大值
ENG_MIN : REAL; // 工程量最小值
RAW_MAX : INT; // 模拟量最大值
RAW_MIN : INT; // 模拟量最小值
END_INTERFACE
VAR_INPUT
END_VAR
VAR_OUTPUT
OUT_PARA : REAL; // 转换后的工程量
ALARM_HIGH_LIMIT : BOOL; // 高限报警输出信号
ALARM_LOW_LIMIT : BOOL; // 低限报警输出信号
END_VAR
VAR
rawValue : INT; // 经过限幅处理的原始值
engValue : REAL; // 转换后的工程量值
delta : REAL; // 工程量范围内极差
highLimit : REAL; // 高限值
lowLimit : REAL; // 低限值
END_VAR
```
METHODS
// 转换模拟量通道IW数值为工程量值
ConvertAnalogToEng : METHOD ConvertAnalogToEng() FOR AnalogConversion
BEGIN
// 限幅处理模拟量输入值,确保其在范围内
rawValue := MAX(MIN(IN_PARA, RAW_MAX), RAW_MIN);
// 计算极差及上下限值
delta := ENG_MAX - ENG_MIN;
highLimit := ENG_MAX - delta * 0.05;
lowLimit := ENG_MIN + delta * 0.05;
// 转换为工程量值并输出
engValue := (rawValue - RAW_MIN) * delta / (RAW_MAX - RAW_MIN) + ENG_MIN;
OUT_PARA := engValue;
// 检测是否超出上下限,并输出报警信号
IF engValue >= highLimit THEN
ALARM_HIGH_LIMIT := TRUE; // 超出高限值,输出高限报警信号
ELSE
ALARM_HIGH_LIMIT := FALSE;
END_IF
IF engValue <= lowLimit THEN
ALARM_LOW_LIMIT := TRUE; // 低于低限值,输出低限报警信号
ELSE
ALARM_LOW_LIMIT := FALSE;
END_IF
END_METHOD
END_FUNCTION_BLOCK
chatGPT_小控 发表于 2023-3-31 21:37
非常抱歉,您是正确的。以下是修正后的程序,包括模拟量转换以及工程量上下限报警设定和输出,且包含工程量 ...
请给我10楼那样的写法,这种的我看不懂
好的,以下是一个采用LAD语言编写的西门子1500 PLC模拟量转化程序,包括工程量的输入值、范围报警和转换后工程量值的输出。请注意,在使用该程序之前,需要先定义您的模拟量信号采集卡所测量的信号量程范围,并与下面程序中的量程范围参数进行匹配。
AnalogConversionTITLE = \\\\\\\\\\\\\\\"Analog Conversion\\\\\\\\\\\\\\\"VERSION : INT := 1;AUTHOR : \\\\\\\\\\\\\\\"Your Name\\\\\\\\\\\\\\\"FAMILY : \\\\\\\"Your Family\\\\\\\"INTERFACE IN_PARA : INT; // 模拟量通道IW数值,需进行转换 ENG_MAX : REAL; // 工程量最大值 ENG_MIN : REAL; // 工程量最小值END_INTERFACEVAR_INPUT IN_PARA : INT; // 模拟量通道IW数值,需进行转换END_VARVAR_OUTPUT OUT_PARA : REAL; // 转换后的工程量 ALARM_HIGH_LIMIT : BOOL; // 高限报警输出信号 ALARM_LOW_LIMIT : BOOL; // 低限报警输出信号END_VARVAR_TEMP rawValue : INT; // 原始模拟量值 engValue : REAL; // 转换后的工程量值 delta : REAL; // 工程量范围内极差 highLimit : REAL; // 高限值 lowLimit : REAL; // 低限值END_VAR// *****************************MAIN PROGRAM****************************// 限幅处理模拟量输入值,确保其在范围内rawValue := MAX(MIN(IN_PARA, 32767), 0); // 假设量程范围为0~32767// 计算极差及上下限值delta := ENG_MAX - ENG_MIN;highLimit := ENG_MAX - delta * 0.05;lowLimit := ENG_MIN + delta * 0.05;// 转换为工程量值并输出engValue := (rawValue - 0) * delta / (32767 - 0) + ENG_MIN;OUT_PARA := engValue;// 检测是否超出上下限,并输出报警信号IF engValue >= highLimit THEN ALARM_HIGH_LIMIT := TRUE; // 超出高限值,输出高限报警信号ELSE ALARM_HIGH_LIMIT := FALSE;ENDIFIF engValue <= lowLimit THEN ALARM_LOW_LIMIT := TRUE; // 低于低限值,输出低限报警信号ELSE ALARM_LOW_LIMIT := FALSE;ENDIFEND_ORGANIZATION_BLOCK
在使用此程序之前,您需要根据您的实际情况修改参数 ENG_MAX、ENG_MIN 和 量程范围。