首先工控项目都会用到:
using System.Runtime.InteropServices;
1、字节转化为单精度浮点数
2、单精度转成字节
3、使用结构体
4、使用动态链接库
5、ASCCII码字符转成16进制数
6、字符转ASCII码,ASCII码转字符
7、字符串转成字符数组
8、整形数据与字节数组相互转换
9、ASCII码的使用,适用于串口通信
10、c#获得时间和路径
1、字节转化为单精度浮点数
//byte[] retdata = new byte[] { 0x00, 0x00, 0x7A, 0x43 }; //43 7A 00 00 是250,在这里要倒过来写
byte[] r;
r=new byte[4];
r[3] = 0x43;
r[2] = 0xac;
r[1] = 0x00;
r[0] = 0x00;
textBox1.Text = BitConverter.ToSingle(r, 0).ToString ();
2、单精度转成字节
float floatvalue;
floatvalue = 2500;
byte[] b = BitConverter.GetBytes(floatvalue );
textBox1.Text =Convert.ToString(b[3],16)+" "+Convert.ToString(b[2],16)+" "+Convert.ToString(b[1],16)+" "+Convert.ToString(b[0],16);
3、使用结构体
(1)先引用命名空间
using System.Runtime.InteropServices;
(2)在public partial class Form1 : Form
{
中声明结构体类型。例如://注意代码的位置
[StructLayout(LayoutKind.Sequential)] //不写这个也行,默认的内存排列就是Sequential,也就是按成员的先后顺序排列.
public struct PVCI_INIT_CONFIG
{
public uint AccCode;
public uint AccMask;
public uint Reserved;
public byte Filter;
public byte kCanBaud;
public byte Timing0;
public byte Timing1;
public byte Mode;
public byte CanRx_IER;
}
(3)在需要使用的地方定义:
形式1:s x;
x.a = 0x55;
x.b = 0x66;
形式2:PVCI_INIT_CONFIG[] config = new PVCI_INIT_CONFIG[1]; //定义一个结构体数组
config[0].AccCode = 0x80000008;
config[0].AccMask = 0xFFFFFFFF;
config[0].Reserved = 204;
config[0].Filter = 0;
config[0].kCanBaud = 12; //500k
config[0].Timing0 = 0x00;
config[0].Timing1 = 0x1C;
config[0].CanRx_IER = 1; //Enable CAN reveive
config[0].Mode = 0;
4、使用动态链接库
有些DLL有依赖文件,例如:吉阳CANUSB的,和DLL相关的有两个VCI_CAN文件和一个SiUSBXp.dll文件。将所有相关文件拷贝到bin\debug中和exe文件在一个文件中。
using System.Runtime.InteropServices;
在窗体类中public partial class Form1 : Form
声明就可以用
[DllImport("VCI_CAN.dll",EntryPoint = "VCI_OpenDevice")]
public static extern int VCI_OpenDevice(uint Devtype, uint Devindex, uint Reserved);
5、ASCCII码字符转成16进制数
//这个在串口通信有实际应用
//如9的ASCCII码是57,将9的ASCCII传进函数,然后57-0x30就是数字9
//再如F的ASCCI码是70,70-'A'=70-65=5,然后5+10就是15也就是F表示的数字
public int HexChar(char c)
{
if ((c >= '0') && (c <= '9'))
return c - 0x30;
else if ((c >= 'A') && (c <= 'F'))
return c - 'A' + 10;
else if ((c >= 'a') && (c <= 'f'))
return c - 'a' + 10;
else
return 0x10;
}
//这个将FE之类的字符串转成数字
public int Str2Hex(string str)
{
int len = str.Length;
if (len == 2)
{
int a = HexChar(str[0]);
int b = HexChar(str[1]);
if (a == 16 || b == 16)
{
MessageBox.Show("format error!");
return 256;
}
else
{
return a * 16 + b;
}
}
else
{
MessageBox.Show("len must be 2");
return 256;
}
}
//可以这样使用,强制转换为字节型,并以字符串显示为254
textBox1.Text = Convert.ToString((byte)Str2Hex("FE"));
//这样就显示FE了
textBox1.Text = Convert.ToString((byte)Str2Hex("FE"),16);
6、字符转ASCII码,ASCII码转字符
public static int Asc(string character)
{
if (character.Length == 1)
{
System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
int intAsciiCode = (int)asciiEncoding.GetBytes(character)[0];
return (intAsciiCode);
}
else
{
throw new Exception("Character is not valid.");
}
}
ASCII码转字符:
单个字符
public static string Chr(int asciiCode)
{
if (asciiCode >= 0 && asciiCode <= 255)
{
System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
byte[] byteArray = new byte[] { (byte)asciiCode };
string strCharacter = asciiEncoding.GetString(byteArray);
return (strCharacter);
}
else
{
throw new Exception("ASCII Code is not valid.");
}
}
Excel专用
/// <summary>
/// ASCII码转字符串(转换为Excel列的形式:A/B/C...AA/AB/AC...BA/BB/......)
/// </summary>
/// <param name="asciiCode">最大数字255(即Excel最末列IV)</param>
/// <returns></returns>
public static string Chr(int asciiCode)
{
if (asciiCode > 0 && asciiCode <= 255)
{
System.Text.ASCIIEncoding asciiEncoding = new System.Text.ASCIIEncoding();
string strCharacter = string.Empty;
byte[] byteArray = null;
int division = (asciiCode - 64) / 26;
int mod = (asciiCode - 64) % 26;
if (mod == 0)
{
division = division - 1;
mod = 26;
}
if ((division == 0) && (mod <= 26))
{
byteArray = new byte[] { (byte)(mod + 64) };
strCharacter = strCharacter + asciiEncoding.GetString(byteArray);
}
else
{
byteArray = new byte[] { (byte)(division + 64) };
strCharacter = strCharacter + asciiEncoding.GetString(byteArray);
byteArray = new byte[] { (byte)(mod + 64) };
strCharacter = strCharacter + asciiEncoding.GetString(byteArray);
}
return strCharacter;
}
else
{
return "ASCII Code is not valid.";
}
}
7、字符串转成字符数组
string ss;
ss = "hello world";
char[] sx=ss.ToCharArray();
int i;
for (i = 0; i < sx.Length; i++)
{
textBox1.Text = textBox1.Text + " " + sx[i];
}
8、整形数据与字节数组相互转换
例如:吉阳CAN的ID号移位问题
int id;
id = 0x088090C1<<3;
byte[] sID = BitConverter.GetBytes(id);
textBox1.Text = Convert.ToString(sID[3], 16) + " " + Convert.ToString(sID[2], 16) + " " + Convert.ToString(sID[1], 16) + " " + Convert.ToString(sID[0], 16) +" ";
//将字节数组组合成32位整形
int rID=0x00000000;
rID = (sID[3] << 24) | (sID[2] << 16)|(sID[1]<<8)|sID[0];
rID = rID >> 3;
9、ASCII码的使用,适用于串口通信
char x = (char)59; //ASCII码是59
textBox1.Text = "hello" + x.ToString()+(char)32+"world"; //asccii码32是空格
//写成数组形式
char[] str = { (char)45,(char)48,(char)100 }; //(char)77 就是ASCII码77的 强制转为字符
textBox1.Text = str[0].ToString() + str[1].ToString() + str[2].ToString(); //用在串口发送上比较合适
10、c#获得时间和路径
// textBox1.Text = DateTime.Now .ToString ()+":"+DateTime.Now.Millisecond .ToString() ; //时间,精确到毫秒
// textBox1.Text = Environment.CurrentDirectory.ToString(); //当前路径
// textBox1.Text = Environment.TickCount.ToString(); //获得系统启动经过的毫秒数
// System.Threading.Thread.Sleep(1000); //暂停1秒
- 构建虚拟工控环境系列 - 西门子虚拟PLC
一. 概述 跟随着工控安全一路走来,工控安全市场今年明显有相当大的改善,无论从政策还是客户需求,都在逐步扩大中.但是,搞工控安全研究的人员却寥寥无几.一方面工控安全是个跨学课的技术,需要了解多方面的知 ...
- 开源纯C#工控网关+组态软件(八)表达式编译器
一. 引子 监控画面的主要功能之一就是跟踪下位机变量变化,并将这些变化展现为动画.大部分时候,界面上一个图元组件的某个状态,与单一变量Tag绑定,比如电机的运行态,绑定一个MotorRunning ...
- 基于 HTML5 WebGL 的计量站三维可视化监控系统 Web 组态工控应用
得益于 HTML5 WebGL 技术的成熟,从技术上对工控管理的可视化,数据可视化变得简单易行!完成对工控设备的管理效率,资源管理,风险管理等的大幅度提高,同时也对国家工业4.0计划作出有力响应! 如 ...
- 工控安全入门(六)——逆向角度看Vxworks
上一篇文章中我们对于固件进行了简单的分析,这一篇我们将会补充一些Vxworks的知识,同时继续升入研究固件内容. 由于涉及到操作系统的内容,建议大家在阅读本篇前有一定操作系统知识的基础,或者是阅读我的 ...
- 基于HTML5的Web SCADA工控移动应用
在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...
- 基于HT for Web的Web SCADA工控移动应用
在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...
- 开源纯C#工控网关+组态软件
一. 前言 在园子潜水也七八年了.说来惭愧,这么多年虽然一直自称.NET铁杆粉丝,然仅限于回几个不痛不痒的贴,既没有发布过代码,也没有写过文章. 看着.NET和C#在国外风生水起,国内却日趋没落, ...
- Web SCADA 电力接线图工控组态编辑器
前言 SVG并非仅仅是一种图像格式, 由于它是一种基于XML的语言,也就意味着它继承了XML的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如SVG可以内嵌于其他的XML文档中,而SVG文档中 ...
- 电力 Web SCADA 工控组态编辑器
前言 SVG 并非仅仅是一种图像格式, 由于它是一种基于 XML 的语言,也就意味着它继承了 XML 的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如 SVG 可以内嵌于其他的 XML 文档 ...
随机推荐
- scala编程第19章学习笔记(1)——类型参数化
一.queues函数式队列 函数式队列是一种具有以下三种操作方式的数据结构: head 返回队列的第一个元素. tail 返回除第一个元素之外的队列. scala> import scala.c ...
- pat 1060 比较科学计数法
trick: 1.前导0 如:000001,000.000001 2.出现0时也要按照科学计数法输出 e.g. 4 00000.00000 0001 NO 0.0000*10^0 0.1*10^1 3 ...
- Restful安全认证及权限的解决方案
一.Restful安全认证常用方式 1.Session+Cookie 传统的Web认证方式.需要解决会话共享及跨域请求的问题. 2.JWT JSON Web Token. 3.OAuth 支持两方和三 ...
- Linux kernel模块管理相关详解
Linux内核模块化设计 1. Linux内核设计:单内核.模块化(动态装载和卸载) (1) Linux:单内核设计,但充分借鉴了微内核体系的设计的优点:为内核引入了模块化机制:(2) 内核的组成部分 ...
- Linux上磁盘挂载
Linux磁盘挂载 一. 磁盘分区 在终端输入fdisk –l 命令查看整个系统的分区情况. 能够看到另一个32G的/dev/vdb磁盘没有挂载使用 watermark/2/text/aHR0c ...
- VS2008+Windows DDK 7的环境配置(二)
在第一篇的基础上,进行如下的步骤,就可以编译出X64的驱动程序. (建议再另外建一个项目,这样避免混淆,因为x86和x64编译的有些编译选项是不同的.) 1. 安装VS2008 x64 build 组 ...
- textarea光标移到末尾兼容ie,ffchrome
function moveEnd(obj){ obj.focus(); var len = obj.value.length; if (document ...
- 细说java中Map的两种迭代方式
曾经对java中迭代方式总是迷迷糊糊的,今天总算弄懂了.特意的总结了一下.基本是算是理解透彻了. 1.再说Map之前先说下Iterator: Iterator主要用于遍历(即迭代訪问)Collecti ...
- C#.NET常见问题(FAQ)-在VS程序如何取消.vshost的进程
双击执行一个EXE程序,会有两个进程,程序关闭之后,貌似只能关闭你的程序,附加的vshost.exe仍然存在 在调试页面,改成release,同时取消最后一项启用承载进程 在生成页面,将高级选 ...
- MFC画图总结-DIB图形绘制
參考文档: http://blog.csdn.net/hnust_xiehonghao/article/details/37652927 http://blog.sina.com.cn/s/blog_ ...