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

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

  2. RD_ADDR读出地址起始位

//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);
  1. PEEK地址对应得值给出来
#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));
  1. SCALE把数字值变换为实际物理值
//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;
  1. 关于TEMP接口区的一个注意点:
  • 如上述code中用于接收函数返回值的#tempScaleWord,因为不会对这个返回值作任何二次利用,故都用一个变量接收。
  • 对于TEMP的拓展:temp只在函数调用时生效,函数执行完毕后立即被释放,下次写入的那一刻再被赋值,故如果是需要二次处理的中间值,最好不要用temp。
posted @   不愿透露姓名的小村村  阅读(39)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示