plc常用编程进制一般有:二进制、八进制、十进制、十六进制。不同的进制在不同的场合应用较多,例如:
八进制,一般用于plc的IO模块,一般都是说8个点16个点,八进八出。二进制,多用于字位转换,流程状态的判断,左移右移等。
十六进制,多用于地址规划,对象字典,通讯地址等。

总结一下进制之间相互转换的方式,顺便帮各位回顾一下,先从简单的十进制转n进制开始,然后是n进制转十进制,道理基本都是相通的。

一、n进制与十进制

1.n进制转十进制
从右往左,按照顺序取每一位的数值 * n进制的x次方,再进行求和,结果就是十进制。例如:

2#1101
10#: 1*2^0 + 0*2^1 + 1*2^2 + 1^2^3=13

8#2015
10#: 5*8^0 + 1*8^1 + 0*8^2 + 2*8^3=1037

16#3E2
10#: 2*16^0 + 14(E)*16^1 + 3*16^2= 994

2.十进制转n进制
反过来相除,再取每一次的余数从右往左排列,组合起来就是对应的进制。例如

10#28
2#:28/2=14余0,14/2=7余0,7/2=3余1,3/2=1余1,1mod2=1,反向组合余数 。结果 11100
8#:28/8=3余4,3mod8=3,结果 34
16#:28/16=1余12,1mod16=1,结果 1C

二、2进制和8进制、16进制
2#和8#、16#成倍数关系,有着8421和421的特殊用法,转换也比较方便,因为2^3=8,2^4=16。例如

2#1011 0101
8#:从右往左按照3个数进行组合划分,010  110  101 ,分别对应 2 6 5,结果265
16#:从右往左按照4个数进行组合划分,1011 0101 ,分别对应11(B)  5,结果 B5


8#1234
2#:将8#数据每一位拆分为3位进行组合,1对应001  2对应010  3对应011  4对应100,结果 001 010 011 100


16#3FD
2#:将16#数据每一位拆分为4位进行组合,3对应0011  F对应1111  D对应1101,结果 0011 1111 1101


三、应用
进制转换只看数据似乎没什么意思,那么在plc中如何去应用呢?以二进制和十进制的转换为例,字和位的调用转换,其余各位可自行探索。


例如通讯地址是int类型的映射,那么一个int中有16个bit,如何取出这16位的状态呢?
plc内部给出位的访问,通过a.0   a.1的方式,但是不能引入变量循环访问,指针也无法取到位地址,这种方式在数据量少的时候用起来还能接受,如果数据量大,例如我有10个字要做传输通讯,10*16=160个bit,这代码操作起来是很要命的!


下面介绍第二种方式,and判断字位转换
and和or本是状态判断,状态判断只有true和false两种,相当于是2进制的判断,int类型默认10进制,在使用and进行判断的时候,就可以间接将int类型隐式转换为2进制,可对位判断。
例如:
VAR
      iData : int:=13;//对应2进制为 1101
END_VAR
第1位状态获取:= iData  and  2#0001
第2位状态获取:= iData  and  2#0010

第3位状态获取:= iData  and  2#0100第4位状态获取:= iData  and  2#1000
分享:进制转换
可以使用更简便的方法来替代2#的数据,使用expt(2,x),即2的x次方,那就可以在for循环中编写了,批量修改数据方便使用。
分享:进制转换 分享:进制转换

位进行组合成字的方式,对应就是获取状态,然后根据1.1中的方法累加2^x次方,就能实现16个bit组合成int。