少有人走的路

勇哥的工业自动化技术网站

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

勇哥注:

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

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


发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。

«    2025年12月    »
1234567
891011121314
15161718192021
22232425262728
293031
控制面板
您好,欢迎到访网站!
  查看权限
网站分类
搜索
最新留言
文章归档
网站收藏
友情链接

Powered By Z-BlogPHP 1.7.3

Copyright www.skcircle.com Rights Reserved.

鄂ICP备18008319号


站长QQ:496103864 微信:abc496103864