zywh 发表于 2012-8-24 13:43:40

有用AVR做工控板的嘛,我移植简易PLC软件时,出现了问题

我用的是AVR Studio+GCC编译器

问题:时间继电器功能和计数器功能,经常出问题。

以下代码编译不通过:
#define_OUT_T(a,k)    if ((ACC_BIT & 0x01) != 0)\
                        { if ((a##_F) == 0){ (a##_F) = 1; a=0; *((&##a)+1) = k; }}\
                        else{ (a##_F) = 0; a=0; }                           // _Tx, _Tx_F, _TKx, K
#define_OUT_C(a,k)    if ((ACC_BIT & 0x01) != 0)               \
                        { if ((a##_F) == 0)                      \
                                                      { (a##_F) = 1;                     \
                                                          if (a < k)                         \
                                                              { a++;                           \
                                                                  if (a >= k)                  \
                                                                          { rC[(&a-&_C0)/8].BYTE |= 1<<((&a-&_C0)%8); }         \
                                                                  else { rC[(&a-&_C0)/8].BYTE &= ~(1 << ((&a-&_C0)%8)); } \
                                                                  }                              \
                                                          }                                    \
                        }                                        \
                        else{ (a##_F) = 0; }                           // _Tx, _Tx_F, _TKx, K
会出现如下经过:
../main.c:176:1: error: pasting "&" and "_T12" does not give a valid preprocessing token

把*((&##a)改成*((&a)就可以编译通过了,但是时间继电器,用起来老是出问题,有时候可以正常用,有时候多加几个梯形图就又不能用了。

100ms定时器,我用的代码是这样的
void _T100mS(void)
{ unsigned char i;
if (Timer_100ms != 0)
    { Timer_100ms--;
      Pulse_val_Sec++;
      if (++Pulse_val_Sec == 5)                                //5
          { Pulse_Sec = ~Pulse_Sec;
          }
      if (Pulse_val_Sec == 10)                                        //10
          { Pulse_Sec = ~Pulse_Sec;
                  Pulse_val_Min++;
          Pulse_val_Sec = 0;
                }
          for (i=0; i<_T_num; i++ )
      { if ((rTF.BYTE & (1 << (i%8))) != 0)
            { if (_T < _T)
                    { _T++;
                              if (_T >= _T)
                  { rT.BYTE|=(1 << (i%8));
                  }
                          }
            }
      }
        }
}

问题出现在哪里,找了很久一直没有找到,望各位兄弟帮忙。

MicroPLC 发表于 2012-8-24 15:31:53

费这个劲呢,www.microplc.com.cn
页: [1]
查看完整版本: 有用AVR做工控板的嘛,我移植简易PLC软件时,出现了问题