最近做的一个项目,其中需要对西门子PLC中定时器的间隔时间进行设置,数据格式为S5Time。
S5Time数据长度为两个字节,转成16进制数后,第一位表示时间基准,第二至四位是用BCD码表示的时间值。时间基准的二进制代码如下:
10ms 00
100ms 01
1s 10
10s 11
举个例子,时间间隔值为5s时,转成16进制的S5Time数就是0x0500,也可以是0x2005等,在PLC中CPU会自动选择较小的时间基准来对数值进行表示,所以从PLC中读到的以上数值应该是0x0500。通过OPC读取到的为十进制表示的整数值,因此用C#读取和设置的时候都必须先进行转换。
知道原理,转换就很容易了,代码如下:
S5Time格式转换
private int ConvertS5TimeToInt32(int init) { int qianwei, baiwei, shiwei, gewei; int beishu = 0; int result = 0; qianwei = init / 4096; init = init % 4096; baiwei = init / 256; init = init % 256; shiwei = init / 16; gewei = init % 16; switch (qianwei) { case 0: beishu = 10; break; case 1: beishu = 100; break; case 2: beishu = 1000; break; case 3: beishu = 10000; break; } result = (baiwei * 100 + shiwei * 10 + gewei) * beishu;
return result; }
private int ConvertInt32ToS5Time(int init) { int qianwei, baiwei, shiwei, gewei; int result = 0; if (0 <= init && init <= 4095) { init = init / 10; qianwei = 0; baiwei = init / 100; init = init % 100; shiwei = init / 10; gewei = init % 10; result = qianwei * 4096 + baiwei * 256 + shiwei * 16 + gewei; } else if (0 <= init / 10 && init / 10 <= 4095) { init = init / 100; qianwei = 1; baiwei = init / 100; init = init % 100; shiwei = init / 10; gewei = init % 10; result = qianwei * 4096 + baiwei * 256 + shiwei * 16 + gewei; } else if (0 <= init / 100 && init / 100 <= 4095) { init = init / 1000; qianwei = 2; baiwei = init / 100; init = init % 100; shiwei = init / 10; gewei = init % 10; result = qianwei * 4096 + baiwei * 256 + shiwei * 16 + gewei; } else if (0 <= init / 1000 && init / 1000 <= 4095) { init = init / 10000; qianwei = 3; baiwei = init / 100; init = init % 100; shiwei = init / 10; gewei = init % 10; result = qianwei * 4096 + baiwei * 256 + shiwei * 16 + gewei; }
return result; }
|
请发表评论