登录
首页 PLC论坛 PLC论坛
回帖 发帖
正文

主题:求助:这段程序啥 意思 ?(急)

点击:723 回复:5

fblock DI111;
attribute(autoscan);
uuid{0e35-8894-0dca-dbd7};
var
ADDR : word;in;
S1 : bool;in;
S2 : bool;in;
S3 : bool;in;
S4 : bool;in;
S5 : bool;in;
S6 : bool;in;
S7 : bool;in;
S8 : bool;in;
S9 : bool;in;
S10 : bool;in;
S11 : bool;in;
S12 : bool;in;
S13 : bool;in;
S14 : bool;in;
S15 : bool;in;
S16 : bool;in;
Disable: bool;in;
Sel_CH : word;in;

VF  : word;out;
I1 : bool;out;
I2 : bool;out;
I3 : bool;out;
I4 : bool;out;
I5 : bool;out;
I6 : bool;out;
I7 : bool;out;
I8 : bool;out;
I9 : bool;out;
I10 : bool;out;
I11 : bool;out;
I12 : bool;out;
I13 : bool;out;
I14 : bool;out;
I15 : bool;out;
I16 : bool;out;
implementation
void main()
{
int * pVal;
pVal = (int*)io_mem(ADDR);
if(!pVal){
VF=0;
}else{

#define _(n) I##n = *pVal & (0x1 << (n-1))?1:0;
if(Disable == 1){

if(Sel_CH & 0x0001){
I1 = S1;
}else{
      _(1);
      }
if(Sel_CH & 0x0002){
I2 = S2;
}else{
      _(2);
      }
if(Sel_CH & 0x0004){
I3 = S3;
}else{
      _(3);
      }
if(Sel_CH & 0x0008){
I4 = S4;
}else{
      _(4);
      }
if(Sel_CH & 0x0010){
I5 = S5;
}else{
      _(5);
      }
if(Sel_CH & 0x0020){
I6 = S6;
}else{
      _(6);
      }
if(Sel_CH & 0x0040){
I7 = S7;
}else{
      _(7);
      }
if(Sel_CH & 0x0080){
I8 = S8;
}else{
      _(8);
      }
      if(Sel_CH & 0x0100){
I9 = S9;
}else{
      _(9);
      }
      if(Sel_CH & 0x0200){
I10 = S10;
}else{
      _(10);
      }
      if(Sel_CH & 0x0400){
I11 = S11;
}else{
      _(11);
      }
      if(Sel_CH & 0x0800){
I12 = S12;
}else{
      _(12);
      }
      if(Sel_CH & 0x1000){
I13 = S13;
}else{
      _(13);
      }
      if(Sel_CH & 0x2000){
I14 = S14;
}else{
      _(14);
      }
      if(Sel_CH & 0x4000){
I15 = S15;
}else{
      _(15);
      }
      if(Sel_CH & 0x8000){
I16 = S16;
}else{
      _(16);
      }
VF=Sel_CH;
}else{
_(1);
_(2);
_(3);
_(4);
_(5);
_(6);
_(7);
_(8);
_(9);
_(10);
_(11);
_(12);
_(13);
_(14);
_(15);
_(16);
VF=0xffff;}
}}
附件 微信截图_20181018070013.jpg
18-10-18 07:01
这程序大慨的意思应该是  当addr为正数是  且disable为1时 输入输出 s/l有效  s和l为一一对应关系    具体那些输入输出有效   根据sel_ch的值来决定  如sel_ch为65535就是把s1-s16的当前值赋值给I1-I16  就瞎翻译的表情看看就好  有错误的地方还请大神们指正
18-10-18 17:37
1、下面这段程序 咋理解 关键是 。
void main()
{
int * pVal;
pVal = (int*)io_mem(ADDR);
if(!pVal){
VF=0;
}else{
#define _(n) I##n = *pVal & (0x1 << (n-1))?1:0;
2、还有下面这段程序中else后面的语句咋 理解 。
if(Sel_CH & 0x4000){
I15 = S15;
}else{
     _(15);
     }
18-10-18 18:43
这是啥PLC啊,
18-10-18 20:20

引用 liuxd6909 在 2018/10/18 18:43:59 发言【内容省略】

我觉得找PLC编程手册应该看看就知道了。
18-10-18 20:27
1void  main  表示主程序
int*pval表示指针
在下一句应该是  pval指向ADDR
在下一句if先对pval做个非运算 如果最终结果为真  就把0赋值给VF  如果为假就执行else以后的语句  在下一句#define宏定意  就是_(n)就代表了后面那一长串  后面那一长穿是三目运算  具体作用没太看明白
2  就是把sel_ch 与0x4000转换成二进制做个与运算  结果为真就把s15的当前值赋值给l15结果为假就执行else以后的语句  后面那个_(15)没太看明白作用  应该和上面宏定义有关
18-10-18 21:09

工控新闻

更多新闻资讯