先用这个方法,不行在使用下面的方法
按 ‘win + r’ 打开运行框,输入regedit打开本地注册表编辑器
找到 \HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\CTF\TIP
删除其子项 {81d4e9c9-1d3b-41bc-9e6c-4b40bf79e35e}

控制面板 语言 里面卸载后,还要删除下面目录 中除了 en-US 之外的文件和目录
C:\Windows\IME
C:\Windows\System32\IME
C:\Windows\SysWOW64\IME

Windows 7 SP1 已预装 3.5.1,可以安装 4.7.2;
Windows XP 没有预装 .NET Framework,可以安装 3.5 和 4.0。

打开注册表: regedit

HKEY_LOCAL_MACHINE\Software\Microsoft\Windows\CurrentVersion\Policies\System

修改这个路径下的键值:EnableLUA 从1 设置为0

<xml>
<return_code>OK</return_code>
<return_time>2021-04-08 01:18:01</return_time>
<return_msg>成功!</return_msg>
</xml>

XmlDocument doc = new XmlDocument();
try
{
//xml文件路径
doc.LoadXml(str);
//得到根节点Project
var root = doc.DocumentElement;
foreach (XmlNode node in root.ChildNodes)//4.遍历根节点(根节点包含所有节点)
{
if (node.Name == "return_code")
{
if (node.InnerText != "OK")
{
Log.Error($"upload failed. ret={str}");
iRet = -1;
break;
}
else
{
Log.Information($"upload success, ret={str}");
iRet = 0;
break;
}
}
}
}
catch (System.Exception e1)
{
Log.Error($"load xml response failed. msg={str},ex={e1.Message}");
tb_status.Text = $"状态:解析后台返回信息发生异常,{e1.Message}";
App.db.m_log_info.Add(new ModelLog { Msg = $"解析后台返回信息发生异常,异常信息={e1.Message}", Time = DateTime.Now.ToString("yyyy-MM-dd HH:mm:ss") });

}

Buffer.BlockCopy 真对原始数据实现的,速度较快
Copies a specified number of bytes from a source array starting at a particular offset to a destination array starting at a particular offset.

Array.Copy 是真对通用环境实现的
Copies a range of elements in one Array to another Array and performs type casting and boxing as required.

Marshal.Copy
Copies data from a managed array to an unmanaged memory pointer, or from an unmanaged memory pointer to a managed array.

读写内存

MemoryStream和BufferedStream都派生自基类Stream,因此它们有很多共同的属性和方法,但是每一个类都有自己独特的用法。这两个类都是实现对内存进行数据读写的功能,而不是对持久性存储器进行读写。

MemoryStream类用于向内存而不是磁盘读写数据。MemoryStream封装以无符号字节数组形式存储的数据,该数组在创建MemoryStream对象时被初始化,或者该数组可创建为空数组。可在内存中直接访问这些封装的数据。内存流可降低应用程序中对临时缓冲区和临时文件的需要。

def gen_fit(x, y, deg):
"""
新版 numpy 不推荐使用 polyfit 和 poly1d 了
新版本的拟合函数
:param x:
:param y:
:param deg:
:return:
"""
coefs = Polynomial.fit(x, y, deg)
ffit = coefs(x)
df_yfit = ffit.to_frame(name='t2')
df_y = y.to_frame()
df_diff = df_yfit - df_y
return df_yfit, df_diff

目前接触到的是凸轮轴

凸轮表面 “棱面” 和 “颤痕” 实质就是凸轮回转表面因磨削不当而在其表面形成的一种微观形状结构,就频率而言,它们介于高频的粗糙度和低频的形状误差之间,属于 “圆周波纹度” 范畴,经验表明,此时的频率约在45-350UPR之间,
棱面 发生的频率在45-75UPR,
颤痕 发生的频率在75-350UPR。

伺服主要靠脉冲来定位,可以这样理解,伺服电机接收到1个脉冲,就会旋转1个脉冲对应的角度,从而实现位移, 并且伺服电机每旋转一个角度,都会发出对应数量的脉冲,这样,和伺服电机接受的脉冲形成了闭环,就能够很精确的控制电机的转动,从而实现精确的定位

伺服电机分为交流伺服和直流伺服两大类。

取数据中桃心中段数据,上下有测量误差不参与计算。

计算角度差

同一桃心,转 4 圈,每两次应该间隔 360 度

最高点设置 180 度

先拟合基圆找到圆心,同理论值的圆心算差值,就是基圆误差

移动测量基圆的圆心和理论值保持同心,然后算型线误差

计算所有凸轮相对于定位销的角度

//查找窗体
[DllImport("User32.dll", EntryPoint = "FindWindow")]
public extern static IntPtr FindWindow(string lpClassName, string lpWindowName);

[DllImport("User32.dll", EntryPoint = "FindWindowEx")]
public static extern IntPtr FindWindowEx(IntPtr hwndParent, IntPtr hwndChildAfter, string lpClassName, string lpWindowName);

IntPtr hwnd = new IntPtr(0);
hwnd = FindWindow(null, "计算器");
//判断这个窗体是否有效
if (hwnd != IntPtr.Zero)
{
// 找到窗口
...
}