×

总线运动卡读通用IO的小程序,一次读取全部模块的IO

勇哥,很想停止 勇哥,很想停止 发表于2025-01-09 16:02:02 浏览854 评论0

抢沙发发表评论

勇哥注:

这段小代码放这里,是为了记录了一个常用常忘的知识。

实验的时候,此卡自带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。



image.png


image.png



程序如下:


(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());


群贤毕至

访客