通过硬件标识符获取过程映像输入

1. 用AI4ST做的模板,使用AI4前两个通道值,一个通道值占用一个IW,共占用2个word。

2. RD_ADDR读出地址起始位

1
2
//get iw by hw_io 
#tempAIw := RD_ADDR(LADDR := #AI4ST_Control.ai_hwio, PIADDR => #AI_rdaddr.piadder, PICount => #AI_rdaddr.picount, PQADDR => #AI_rdaddr.temppiadder, PQCount => #AI_rdaddr.temppicount);

3. PEEK地址对应得值给出来

1
2
#AI4ST_Control.Ch0_Dig_Value := PEEK_WORD(area := 16#81, dbNumber := 0, byteOffset := #AI_rdaddr.piadder);
#AI4ST_Control.Ch1_Dig_Value := PEEK_WORD(area := 16#81, dbNumber := 0, byteOffset := (#AI_rdaddr.piadder + 2));

4. 用SCALE把数字值变换为实际物理值

1
2
3
4
5
6
7
8
9
10
//value word to real
//16#01是表征通道类型为电压的一个前序条件,在这里没有太多实际意义
//16#02是表征通道类型为电流的一个前序条件,在这里没有太多实际意义
IF #pre_write.measure_mode = 16#01 THEN
#tempScaleWord := SCALE(IN := WORD_TO_INT(#AI4ST_Control.Ch0_Dig_Value), HI_LIM := 10.0, LO_LIM := -10.0, BIPOLAR := 1, OUT => #AI4ST_Control.Ch0_Ana_Value);
#tempScaleWord := SCALE(IN := WORD_TO_INT(#AI4ST_Control.Ch1_Dig_Value), HI_LIM := 10.0, LO_LIM := -10.0, BIPOLAR := 1, OUT => #AI4ST_Control.Ch1_Ana_Value);
ELSIF #pre_write.measure_mode = 16#02 THEN
#tempScaleWord := SCALE(IN := WORD_TO_INT(#AI4ST_Control.Ch0_Dig_Value), HI_LIM := 20.0, LO_LIM := -20.0, BIPOLAR := 1, OUT => #AI4ST_Control.Ch0_Ana_Value);
#tempScaleWord := SCALE(IN := WORD_TO_INT(#AI4ST_Control.Ch1_Dig_Value), HI_LIM := 20.0, LO_LIM := -20.0, BIPOLAR := 1, OUT => #AI4ST_Control.Ch1_Ana_Value);
END_IF;

5. 关于TEMP接口区的一个注意点:

  • 如上述code中用于接收函数返回值的#tempScaleWord,因为不会对这个返回值作任何二次利用,故都用一个变量接收。
  • 对于TEMP的拓展:temp只在函数调用时生效,函数执行完毕后立即被释放,下次写入的那一刻再被赋值,故如果是需要二次处理的中间值,最好不要用temp。

通过硬件标识符获取过程映像输入
http://example.com/2024/07/21/通过硬件标识符获取过程映像输入/
作者
xiao cuncun
发布于
2024年7月21日
许可协议