any_014 发表于 2012-11-10 11:34:58

请教:许工的简易PLC示例程序 里X输入 Y输出子函数,看不....

本帖最后由 any_014 于 2012-11-10 13:19 编辑

//-------------------------------------------------------------------------------------//
// 初始化,输入输出,内存处理 子函数                                                   //
//-------------------------------------------------------------------------------------//
void input_IO(void)         //X输入,Y输出刷新
{ unsigned char i;
i = P2;
i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
rX.BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX.BYTE = ~(i & 0x0f) & 0x0f;
rX.BYTE = ~Get_EX_BIT();
P0 = rY.BYTE;
Out_EY_BIT();
_M8011_ = Pulse_10ms;
_M8012_ = Pulse_100ms;
_M8013_ = Pulse_Sec;
_M8014_ = Pulse_Min;
}

以上为原程序里的函数,其中
i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
是什么意思呢?
-------------------------------------------------------------------------------------
算了下。I各位如果是 BIT7...BIT0.
如果经过 i = ((i << 1) & 0xaa) | ((i >> 1) & 0x55);
则变为:BIT6,BIT7,BIT4,BIT5,BIT2,BIT3,BIT0,BIT1。
也就是相邻两位换位。
------------------------------------------------------------------------------------
经过 i = ((i << 2) & 0xcc) | ((i >> 2) & 0x33);
则变为:BIT4,BIT5,BIT6,BIT7,BIT0,BIT1,BIT2,BIT3
两次变换的结果是高四位和低四位换位。
-------------------------------------------------------------------------------------
rX.BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX.BYTE = ~(i & 0x0f) & 0x0f;
这两句又不知道是什么意思了。
第一句是将I的高四位即P2的低四位和P1的低四位组合到一块,取反,存放rX里。
rX里放的是i的低四位,即P2的高四位,取反。   
为何要取反?   输入本来是低电平有效?软件上取反变为高电平有效?
那rX和rX里放的书还是不明白,P2的输入为何要分开放到rX哦rX里?
P1口的低四位又从何而来?12点输入?
------------------------------------------------------------------------------------
看了简易PLC原理图,明白了,P0口低四位为X0-X3,P2口高四位为X4-X7,低四位为X10-X13。

any_014 发表于 2012-11-29 16:48:24

本帖最后由 any_014 于 2012-11-29 16:57 编辑

新问题:flash里每个字节存储的是2位ASC码,GX软件读取数据的时候那就是2位2位的读?
----------------------------------------------------------------------------------------------------------------------
好像真的是2位2位的读写...
好像认为2位ASC码组成的数组位一个长度...

any_014 发表于 2012-12-5 10:20:55

本帖最后由 any_014 于 2012-12-5 16:17 编辑

在PLC52x_FNC.c里的
char* ADDR_int_ppp(unsigned int a)    // (¶ÁÈëintµãÄÚÈÝ£¬·µ»ØµØÖ·¾ø¶ÔÖ¸Õë)
{ unsigned char *p;
a &= 0xfff;
if (a<0x400)
        { if (a < _S_num)
          { p= (unsigned char*)rS + (a / 8);                                               //any;ÓÒÒÆ3λ£¿ÎªÊ²Ã´£¿
                }
        }
else if(a<0x500)
       ......
}

这里的a/8是将16位整型变量a去掉低3位,这样做的用途是什么呢?一个软元件点要占8个字节?

下面又有些函数用到了该变量的低3位。比如:
unsigned int RD_int_ppp(unsigned int a)    // (¶ÁÈëintµãÄÚÈÝ)
{ unsigned char *p;
unsigned char i, n;
unsigned intIa;
p = ADDR_int_ppp(a);
n = 0x10;
i = a % 8;
Ia = (unsigned int)(*p++);
n -= (8-i);
for (; n>=8; )   
    { Ia = ((unsigned int)(*p++) << 8) | Ia;
          n-= 8;
        }
if (n != 0)
        { Ia = ((unsigned int)(*p++) << (16-n)) | (Ia >> n);
        }
else ;
return Ia;
}

i是a的低3位,肯定小于8,n=0x10;换成十进制数是16,那么n-=(8-i)的用途是什么呢?   结果是8+i吗? for循环里还是循环了i次?
for循环里有个n-=8,应该是1次。
那么Ia里放的又是什么呢?在这个子函数里Ia第一次赋值是软元件点a的绝对地址p所指向的内容,8位;第二次赋值是在for循环里,将p指向的下一个字节的内容左移8位和原值相加;如果a的低8位i不是0的话,将会有第三次赋值,将p指向的再下一个字节内容左移(8+i)位,和上一次赋值相加。
该函数的用途是读入软元件点的内容,那么Ia应该就是内容了,但搞不明白这是怎么回事。
----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
好像是这样的,软件元内容只是字节中的一位,一个字节包含了8个软件元的内容。函数参数中的a的后三位是该软元件点的内容在该字节中的位置。
那么函数的参数a到底是怎样的一个整型参数?最高8位舍掉,最低3位置定软元件点在以字节为存储单位的变量中的位置。中间的那些呢?

------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
unsigned char RD_Mp(unsigned int a)    // (读入扩展存储器Mp内的点内容)
{ unsigned char n=0;
return(n & 0x01);
}
这个函数好像没写完。
页: [1]
查看完整版本: 请教:许工的简易PLC示例程序 里X输入 Y输出子函数,看不....