首先工控项目都会用到:
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秒

C#搞工控的一些代码的更多相关文章

  1. 构建虚拟工控环境系列 - 西门子虚拟PLC

    一. 概述 跟随着工控安全一路走来,工控安全市场今年明显有相当大的改善,无论从政策还是客户需求,都在逐步扩大中.但是,搞工控安全研究的人员却寥寥无几.一方面工控安全是个跨学课的技术,需要了解多方面的知 ...

  2. 开源纯C#工控网关+组态软件(八)表达式编译器

    一.   引子 监控画面的主要功能之一就是跟踪下位机变量变化,并将这些变化展现为动画.大部分时候,界面上一个图元组件的某个状态,与单一变量Tag绑定,比如电机的运行态,绑定一个MotorRunning ...

  3. 基于 HTML5 WebGL 的计量站三维可视化监控系统 Web 组态工控应用

    得益于 HTML5 WebGL 技术的成熟,从技术上对工控管理的可视化,数据可视化变得简单易行!完成对工控设备的管理效率,资源管理,风险管理等的大幅度提高,同时也对国家工业4.0计划作出有力响应! 如 ...

  4. 工控安全入门(六)——逆向角度看Vxworks

    上一篇文章中我们对于固件进行了简单的分析,这一篇我们将会补充一些Vxworks的知识,同时继续升入研究固件内容. 由于涉及到操作系统的内容,建议大家在阅读本篇前有一定操作系统知识的基础,或者是阅读我的 ...

  5. 基于HTML5的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  6. 基于HT for Web的Web SCADA工控移动应用

    在电力.油田燃气.供水管网等工业自动化领域Web SCADA的概念已经提出了多年,早先年的Web SCADA前端技术大部分还是基于Flex.Silverlight甚至Applet这样的重客户端方案,在 ...

  7. 开源纯C#工控网关+组态软件

    一.   前言 在园子潜水也七八年了.说来惭愧,这么多年虽然一直自称.NET铁杆粉丝,然仅限于回几个不痛不痒的贴,既没有发布过代码,也没有写过文章. 看着.NET和C#在国外风生水起,国内却日趋没落, ...

  8. Web SCADA 电力接线图工控组态编辑器

    前言 SVG并非仅仅是一种图像格式, 由于它是一种基于XML的语言,也就意味着它继承了XML的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如SVG可以内嵌于其他的XML文档中,而SVG文档中 ...

  9. 电力 Web SCADA 工控组态编辑器

    前言 SVG 并非仅仅是一种图像格式, 由于它是一种基于 XML 的语言,也就意味着它继承了 XML 的跨平台性和可扩展性,从而在图形可重用性上迈出了一大步.如 SVG 可以内嵌于其他的 XML 文档 ...

随机推荐

  1. JMS基本概念之一

    The Java Message Service(JMS) API is a messaging standard that allows application components based o ...

  2. [12] 扇形体(Fan)图形的生成算法

    顶点数据的生成 bool YfBuildFunVertices ( Yreal radius, Yreal degree, Yreal height, Yuint slices, YeOriginPo ...

  3. 第十一章 AtomicInteger源码解析

    1.原子类 可以实现一些原子操作 基于CAS 下面就以AtomicInteger为例. 2.AtomicInteger 在没有AtomicInteger之前,对于一个Integer的线程安全操作,是需 ...

  4. 玩转OpenStack

    一.OpenStack包含那些内容 1.预备知识 首先会有虚拟化和云计算的“预备知识”,会介绍 KVM,IaaS 等技术. 2.OpenStack核心 包含OpenStack的架构和和各个核心组件. ...

  5. iOS开发-音乐播放

    现在的各种App大行其道,其实常用也就是围绕着吃喝玩乐基本的需求,视频,音乐在智能手机出现之前更是必不可少的功能,每个手机都会有一个自带的音乐播放器,当然公众也有自己的需求所以也就造就了各种音乐播放软 ...

  6. IOS中Key-Value Coding (KVC)的使用详解

    kvc,键值编码,是一个非正式的协议,它提供一种机制来间接访问对象的属性.直接访问对象是通过调用访问器的方法实现,而kvc不需要调用访问器的设置和获取方法,可以直接访问对象的属性. 下面介绍一下kvc ...

  7. SqlServer数据库(可疑)解决办法4种

     亲自试过,可行!!!!! SqlServer数据库(可疑)解决办法4种   重启服务--------------------------------------------------日志文件丢了, ...

  8. COM中的几个基本概念

    类厂 组件结构示例 DllGetClassObject COM库与类厂的交互

  9. MAC下PHP开发

    ZendStudio 10.5安装: http://blog.sina.com.cn/s/blog_7c8dc2d50101nhvb.html PHP+MySQL+Apache开发环境安装:XAMPP ...

  10. Discuz常见大问题-如何使用云采集插件

    在百度中搜discuz 云采集插件(直接在Discuz官方的插件库中搜可能搜不到) 启用这个插件 随后在任意版块发帖的时候,顶部都会有一个文本框,可以直接放别人博客的帖子,点击获取将生成到你发的帖子中 ...