勇哥注:
这段小代码放这里,是为了记录了一个常用常忘的知识。
实验的时候,此卡自带4个输入IO,另外总线上连接了两个16位的输入DI。
因此共有36个输入DI。
测试的时候故意短接了三个输入IO点。
这款卡的按字节读取全部IO的api是MCCE135.mcc_io_read_inbyte(),说明如下:
short mcc_io_read_inbyte(WORD CardNo,WORD StartByte,WORD ByteNum, BYTE
*ValueList);
功 能: 按 byte 读取控制卡输入端口的电平;
参 数:CardNo: 控制卡卡号,取值范围:0-7;
StartByte: 总线 Di 起始字节数,取值范围:0-128;
ByteNum:需要读取的总线 Di 总字节数量,取值范围:0-128;
ValueList: Di 端口电平值数组,转换为 2 进制后对应每一位 bit,
其中 0:表示低电平(on),1:表示高电平(off);
评:此api功能不错,它可以一次读取主板IO+全部扩展IO,可以读取主板+64个16口的DI模块。
相当于一次读取1036个输入IO。
程序如下:
(1)Convert.ToString(byteData[i], 2) 转2进制串
(2).PadLeft(8, '0') 这个用于在左边补0,其实这里用不上,因为一个byte固定为8位,不需要补0。
(3).ToCharArray().Reverse().ToArray() 这个是把位次序反转过来,如果不返过来则影响阅读。(一般我们习惯左边第1个位是一个byte的第1位)
byte[] byteData = new byte[5]; MCCE135.mcc_io_read_inbyte((ushort)m_nCardNo, 0, 5, byteData); StringBuilder sb1 = new StringBuilder(); for (int i = 0; i < 5; i++) { sb1.Append( (Convert.ToString(byteData[i], 2).PadLeft(8, '0')).ToCharArray().Reverse().ToArray()); sb1.Append(Environment.NewLine); } timer1.Stop(); MessageBox.Show(sb1.ToString());

