首先工控项目都会用到:
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. google protocol buffer的原理和使用(二)

    本文主要会介绍怎么使用Google Protocol的Lib来序列化我们的数据,方法非常多种,本文仅仅介绍当中的三种.其它的方法读者能够通过自行研究摸索.但总的来说,序列化数据总的来说分为下面俩步: ...

  2. mini-parser

    https://leetcode.com/problems/mini-parser/ /** * // This is the interface that allows for creating n ...

  3. 使用Topshelf 5步创建Windows 服务

    使用Topshelf创建Windows 服务简要的介绍了创建Windows服务的另一种方法,老外的一篇文章Create a .NET Windows Service in 5 steps with T ...

  4. Dropwizard框架入门

    最近项目用到了Dropwizard框架,个人感觉还不错,那么这里就从他们官网入手,然后加上自己的实现步骤让大家初步了解这个框架. 官网对DW(Dropwizard)的定义是跨越了一个库和框架之间的界限 ...

  5. 你应该知道的30个jQuery代码开发技巧

    1. 创建一个嵌套的过滤器 .filter(":not(:has(.selected))") //去掉所有不包含class为.selected的元素 2. 重用你的元素查询 var ...

  6. 又议android中的manifest清单文件

    写过java程序的人,都知道了配置文件时java实现各种各样的框架的一大利器,manifest清单文件对android的作用自然不言而喻,然而他里面究竟定义了些什么,并且他是如何加载到程序中的. 他里 ...

  7. Android -- taskAffinity

    每个Activity都有taskAffinity属性,这个属性指出了它希望进入的Task.如果一个Activity没有显式的指明该Activity的taskAffinity,那么它的这个属性就等于Ap ...

  8. (转)Unity3D占用内存太大的解决方法

    自:http://www.cnblogs.com/88999660/archive/2013/03/15/2961663.html 最近网友通过网站搜索Unity3D在手机及其他平台下占用内存太大.  ...

  9. QML 与 C++ 交互之工厂方法

    QML 与 C++ 交互之工厂方法 先看例如以下的类声明,声明了一个产品类和工厂类. #include <QObject> class Productor : public QObject ...

  10. C#.NET常见问题(FAQ)-interface接口如何理解

    个人把interface理解为一种比较特殊的判断技巧,不是常规的变量类型比如判断字符串,判断数组,而是判断类的实例是否拥有某些属性或者方法(比如有十个女的穿一样的衣服,头上盖住,让新郎去猜哪一个是他的 ...