搜索
bottom↓
回复: 2

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

[复制链接]

出0入0汤圆

发表于 2012-11-10 11:34:58 | 显示全部楼层 |阅读模式
本帖最后由 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[0].BYTE = ~((P1 & 0x0f) | (i & 0xf0));
  rX[1].BYTE = ~(i & 0x0f) & 0x0f;
  rX[2].BYTE = ~Get_EX_BIT();
  P0 = rY[0].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[0].BYTE = ~((P1 & 0x0f) | (i & 0xf0));
rX[1].BYTE = ~(i & 0x0f) & 0x0f;
这两句又不知道是什么意思了。
第一句是将I的高四位即P2的低四位和P1的低四位组合到一块,取反,存放rX[0]里。
rX[1]里放的是i的低四位,即P2的高四位,取反。   
为何要取反?   输入本来是低电平有效?软件上取反变为高电平有效?
那rX[0]和rX[1]里放的书还是不明白,P2的输入为何要分开放到rX[0]哦rX[1]里?
P1口的低四位又从何而来?12点输入?
------------------------------------------------------------------------------------
看了简易PLC原理图,明白了,P0口低四位为X0-X3,P2口高四位为X4-X7,低四位为X10-X13。

阿莫论坛20周年了!感谢大家的支持与爱护!!

月入3000的是反美的。收入3万是亲美的。收入30万是移民美国的。收入300万是取得绿卡后回国,教唆那些3000来反美的!

出0入0汤圆

 楼主| 发表于 2012-11-29 16:48:24 | 显示全部楼层
本帖最后由 any_014 于 2012-11-29 16:57 编辑

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

出0入0汤圆

 楼主| 发表于 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 int  Ia;
  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);
}
这个函数好像没写完。
回帖提示: 反政府言论将被立即封锁ID 在按“提交”前,请自问一下:我这样表达会给举报吗,会给自己惹麻烦吗? 另外:尽量不要使用Mark、顶等没有意义的回复。不得大量使用大字体和彩色字。【本论坛不允许直接上传手机拍摄图片,浪费大家下载带宽和论坛服务器空间,请压缩后(图片小于1兆)才上传。压缩方法可以在微信里面发给自己(不要勾选“原图),然后下载,就能得到压缩后的图片】。另外,手机版只能上传图片,要上传附件需要切换到电脑版(不需要使用电脑,手机上切换到电脑版就行,页面底部)。
您需要登录后才可以回帖 登录 | 注册

本版积分规则

手机版|Archiver|amobbs.com 阿莫电子技术论坛 ( 粤ICP备2022115958号, 版权所有:东莞阿莫电子贸易商行 创办于2004年 (公安交互式论坛备案:44190002001997 ) )

GMT+8, 2024-4-27 16:32

© Since 2004 www.amobbs.com, 原www.ourdev.cn, 原www.ouravr.com

快速回复 返回顶部 返回列表