需求场景
下图为贵航装零件的托盘,一个托盘可以装8个零件,我们按图中顺序对零件进行了排序,零件的各种信息通过RFID读写。托盘到出库口后机械手会按照图中顺序以及一定的数量来抓取零件。
问题
我们如何计算将抓取后的零件的数量信息并且将其写进RFID(转换成RFID可以识别的数据信息)
解决方案
先说明在KEPSERVER中,我们为RFID地址信息建了很多个byte数组或变量,每个数组代表一种信息,下图为RFID数据信息。
我们不需要关心太多东西,就看下数量这个地址描述的信息,即用二进制按顺序来对8个零件信息进行标识,1代表有零件,0代表无零件。
接下来用例子来说明:
我们程序首先是从RFID地址中读取其数量,这个都是byte类型的变量,我们读到的都是一个十进制数,假设为数量为:166,那我们得首先将其转换为二进制数,之后,机械手拿走一定数量(假设拿走2个)的零件后,我们按此数量从高位到低位的顺序去掉有 1 的位置,截取剩余的位数并将其转为十进制即可。
代码实现如下:
string a = Convert.ToString(166, 2);//十进制数166转为二进制字符串10100110
Regex rex = new Regex("1");//正则表达式类定义要找的数“1”
var num = rex.Matches(a); //在101001110中找出所有的“1”
string b = a.Substring(num[2].Index);//对10100110从第3个“1”进行截取
int m = Convert.ToInt32(b, 2); //将二进制字符串110转换为十进制6
Console.WriteLine(m);//输出剩余数量6
字符串反转
string s = "123456789a";
char [] arr = s.ToCharArray(); // 转为字符数组
Array.Reverse(arr); // 将数组反转
string s2 = new String(arr); // 将反转后的数组重新转为字符串
问题:将给定的数值转换为二进制,并按低位到高位取给定的数量,最后返回取完后的十进制数
以下代码中source为给定的数值即物料位置信息,index为从低位到高位要取的零件个数
private static int GetRegexResult(int source, int index)
{
var array = Convert.ToString(source, 2);//转二进制
var d = array.Reverse();
string str=null;
foreach (var item in d)
{
str = str + item.ToString();
}
Regex myRegex = new Regex(@"1");
MatchCollection mCollection = myRegex.Matches(str);
var a = mCollection[index].Index;
var b = str.Substring(a);
string st = null;
foreach (var item in b.Reverse())
{
st = st + item.ToString();
}
int num = array.Length - st.Length;
for (int i = 0; i < num; i++)
{
st = st + "0";
}
var c = Convert.ToInt32(st, 2);
return Convert.ToInt32(st, 2); ;//二进制字符串转十进制整数
}
网友评论