intouch日历控件 使用c#做的控件

c#实时读取数据库的问题
[问题点数:20分,结帖人qida0911]
本版专家分:0
结帖率 90%
CSDN今日推荐
本版专家分:6
本版专家分:451120
2017年 总版技术专家分年内排行榜第十2013年 总版技术专家分年内排行榜第八
2017年2月 总版技术专家分月排行榜第三
2018年7月 .NET技术大版内专家分月排行榜第一2018年6月 .NET技术大版内专家分月排行榜第一2018年1月 .NET技术大版内专家分月排行榜第一2017年5月 .NET技术大版内专家分月排行榜第一2017年4月 .NET技术大版内专家分月排行榜第一2017年3月 .NET技术大版内专家分月排行榜第一2017年2月 .NET技术大版内专家分月排行榜第一2016年10月 .NET技术大版内专家分月排行榜第一2016年8月 .NET技术大版内专家分月排行榜第一2016年7月 .NET技术大版内专家分月排行榜第一
2018年4月 .NET技术大版内专家分月排行榜第二2018年3月 .NET技术大版内专家分月排行榜第二2017年12月 .NET技术大版内专家分月排行榜第二2017年9月 .NET技术大版内专家分月排行榜第二2017年7月 .NET技术大版内专家分月排行榜第二2017年6月 .NET技术大版内专家分月排行榜第二2016年12月 .NET技术大版内专家分月排行榜第二2016年9月 .NET技术大版内专家分月排行榜第二2016年6月 .NET技术大版内专家分月排行榜第二2016年3月 .NET技术大版内专家分月排行榜第二2016年1月 .NET技术大版内专家分月排行榜第二2015年12月 .NET技术大版内专家分月排行榜第二2015年2月 .NET技术大版内专家分月排行榜第二2015年1月 .NET技术大版内专家分月排行榜第二2014年11月 .NET技术大版内专家分月排行榜第二2014年5月 .NET技术大版内专家分月排行榜第二2014年4月 .NET技术大版内专家分月排行榜第二2012年2月 多媒体/设计/Flash/Silverlight 开发大版内专家分月排行榜第二
本版专家分:0
本版专家分:0
本版专家分:0
匿名用户不能发表回复!
其他相关推荐
C#串口采集短信GSM数据采集。
可以实时采集多终端24小时数据,存入access数据库和每日.txt文件,并实时显示各参数曲线。
可以按终端按日期查询历史数据。
接收数据格式:$REP,H3,,00,,,13,W+26.73,S00.21,P04.12,D00.47,Y000.047,Z,
1、引用命名空间 using System.T
2、添加一个时间控件 timer1 ,一个button1按钮以便启动,停止,datagridview显示数据库数据
3、在时间控件里面写需要执行的方法。
我这里查询的是数据库,一旦数据库的数据有变化,显示在datagridview里面的数据也会改变
#region 执行的方法
private void timer
package com.T
import java.sql.C
import java.sql.DriverM
import java.sql.ResultS
import java.sql.SQLE
import java.sql.S
public class Mysql {
public static v
本文是按照自己的理解表述的,如有不妥之处,请多多赐教
1.连接数据库
代码引用:using System.Data.SqlClientSqlConnection sqlConn = new SqlConnection (connectionString);注:connectionString是与数据库连接的字符串,一般connectionString通过配置文件获取
第一种方式:配置文
using System.D
using System.Windows.F
using System.Data.SqlC
using System.D
namespace tcha
C# chart实时数据显示简单示例工程文件,
详细说明可以参看相关博文
用c#编写的opc客户端(数据同时存入mysql数据库),实现了利用opc通讯协议将底层的数据存入数据库。
用c#编写的winform程序,读取串口的数据,并写入本地的sqlite数据库,同时写入SQLServer网络数据库,这个过程都是多线程的。
本客户端是在实际项目中检验过的,十分稳定,采用的库文件是OpcNetApiChs.dll,数据库采用MySql,收到的数据存到数据库中,通用性强
sqlserver2008
CREATE TABLE [dbo].[CarInfo](
[ID] [int] IDENTITY(1,1) NOT NULL,
[CarNo] [varchar](50) NOT NULL,
[Lng] [varchar](50) NOT NULL,
[Lat] [varchar](5请教如何用word制作框架结构的报表?
[问题点数:0分]
本版专家分:0
结帖率 100%
CSDN今日推荐
本版专家分:13
本版专家分:395
2007年11月 PHP大版内专家分月排行榜第一
本版专家分:16
匿名用户不能发表回复!
其他相关推荐&>&C#+Access实现的通讯录管理软件[KeepInTouch]源码(三层架构)
C#+Access实现的通讯录管理软件[KeepInTouch]源码(三层架构)
上传大小:1.68MB
该实例是一个基于Access数据库实现的通讯录软件,C#语言编写,采用了标准的三层架构。实现了基本的联系人增删改查,生日邮件提醒,高级联系人分组。
资源亮点:WinForm窗体的多样化应用,数据库表结构设计,三层架构的应用。
综合评分:5
{%username%}回复{%com_username%}{%time%}\
/*点击出现回复框*/
$(".respond_btn").on("click", function (e) {
$(this).parents(".rightLi").children(".respond_box").show();
e.stopPropagation();
$(".cancel_res").on("click", function (e) {
$(this).parents(".res_b").siblings(".res_area").val("");
$(this).parents(".respond_box").hide();
e.stopPropagation();
/*删除评论*/
$(".del_comment_c").on("click", function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_invalid/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parents(".conLi").remove();
alert(data.msg);
$(".res_btn").click(function (e) {
var parentWrap = $(this).parents(".respond_box"),
q = parentWrap.find(".form1").serializeArray(),
resStr = $.trim(parentWrap.find(".res_area_r").val());
console.log(q);
//var res_area_r = $.trim($(".res_area_r").val());
if (resStr == '') {
$(".res_text").css({color: "red"});
$.post("/index.php/comment/do_comment_reply/", q,
function (data) {
if (data.succ == 1) {
var $target,
evt = e || window.
$target = $(evt.target || evt.srcElement);
var $dd = $target.parents('dd');
var $wrapReply = $dd.find('.respond_box');
console.log($wrapReply);
//var mess = $(".res_area_r").val();
var mess = resS
var str = str.replace(/{%header%}/g, data.header)
.replace(/{%href%}/g, 'http://' + window.location.host + '/user/' + data.username)
.replace(/{%username%}/g, data.username)
.replace(/{%com_username%}/g, data.com_username)
.replace(/{%time%}/g, data.time)
.replace(/{%id%}/g, data.id)
.replace(/{%mess%}/g, mess);
$dd.after(str);
$(".respond_box").hide();
$(".res_area_r").val("");
$(".res_area").val("");
$wrapReply.hide();
alert(data.msg);
}, "json");
/*删除回复*/
$(".rightLi").on("click", '.del_comment_r', function (e) {
var id = $(e.target).attr("id");
$.getJSON('/index.php/comment/do_comment_del/' + id,
function (data) {
if (data.succ == 1) {
$(e.target).parent().parent().parent().parent().parent().remove();
$(e.target).parents('.res_list').remove()
alert(data.msg);
//填充回复
function KeyP(v) {
var parentWrap = $(v).parents(".respond_box");
parentWrap.find(".res_area_r").val($.trim(parentWrap.find(".res_area").val()));
评论共有4条
结构很清晰,有必要的注释,学习一下
架构不错,能加上说明更好!
架构不错,值得学习学习
综合评分:
积分/C币:3
综合评分:
积分/C币:3
VIP会员动态
CSDN下载频道资源及相关规则调整公告V11.10
下载频道用户反馈专区
下载频道积分规则调整V1710.18
spring mvc+mybatis+mysql+maven+bootstrap 整合实现增删查改简单实例.zip
资源所需积分/C币
当前拥有积分
当前拥有C币
输入下载码
为了良好体验,不建议使用迅雷下载
C#+Access实现的通讯录管理软件[KeepInTouch]源码(三层架构)
会员到期时间:
剩余下载个数:
剩余积分:0
为了良好体验,不建议使用迅雷下载
积分不足!
资源所需积分/C币
当前拥有积分
您可以选择
程序员的必选
绿色安全资源
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
为了良好体验,不建议使用迅雷下载
资源所需积分/C币
当前拥有积分
当前拥有C币
您的积分不足,将扣除 10 C币
为了良好体验,不建议使用迅雷下载
无法举报自己的资源
你当前的下载分为234。
你还不是VIP会员
开通VIP会员权限,免积分下载
你下载资源过于频繁,请输入验证码
您因违反CSDN下载频道规则而被锁定帐户,如有疑问,请联络:!
若举报审核通过,可返还被扣除的积分
被举报人:
请选择类型
资源无法下载 ( 404页面、下载失败、资源本身问题)
资源无法使用 (文件损坏、内容缺失、题文不符)
侵犯版权资源 (侵犯公司或个人版权)
虚假资源 (恶意欺诈、刷分资源)
含色情、危害国家安全内容
含广告、木马病毒资源
*投诉人姓名:
*投诉人联系方式:
*版权证明:
*详细原因:
C#+Access实现的通讯录管理软件[KeepInTouch]源码(三层架构)在上一篇博客中,学习了使用javascript和jquery两种方法来进行前后台交互。本篇博客着重利用jquery+echarts来实现从后台取数,从前端echarts中展示。1.html页面编写:a.echarts.js导入,jquery框架导入。&!DOCTYPE html&
&html xmlns="http://www.w3.org/1999/xhtml"&
&script src="Scripts/echart/echarts.js"&&/script&
&script src="Scripts/jquery-3.3.1.min.js"&&/script&
&script src="Scripts/echart/macarons.js"&&/script&
&meta http-equiv="Content-Type" content="text/ charset=utf-8"/&
&title&echart demo to ajax+json&/title&
&/head&b.echarts+ajax脚本编写:&body&
&div id="main" style="width: 600height:400"&&/div&
&script type="text/javascript"&
var mychart = echarts.init(document.getElementById('main'), 'macarons');
mychart.setOption({
text: '异步加载数据示例'
tooltip: {},
data: ['销量']
yAxis: {},
series: [{
name: '销量',
type: 'bar',
mychart.showLoading();
var names =[];
//类别数组(实际用来盛放X轴坐标值)
var nums = [];
//销量数组(实际用来盛放Y坐标值)
type: "post",
async: true,
//异步请求(同步请求将会锁住浏览器,用户其他操作必须等待请求完成才可以执行)
url: "index.aspx?method=getdata",
//url:"Handler.ashx?method=getdata",
dataType: "json",
//返回数据形式为json
success: function (result) {
//请求成功时执行该函数内容,result即为服务器返回的json对象
if (result) {
//var json = $.parseJSON(result);
alert(result);
for (var i = 0; i & result. i++) {
//alert(result[i].name);
names.push(result[i].names);
//挨个取出类别并填入类别数组
for (var i = 0; i & result. i++) {
nums.push(result[i].nums);
//挨个取出销量并填入销量数组
mychart.hideLoading();
//隐藏加载动画
mychart.setOption({
//加载数据图表
data: names
series: [{
// 根据名字对应到相应的系列
name: '销量',
data: nums
error: function (errorMsg) {
//请求失败时执行该函数
alert("图表请求数据失败!");
myChart.hideLoading();
&/script&2.后台脚本编写(有两种方法:一种使用aspx后台脚本,一种使用一般处理程序ashx)2.1利用aspx后台脚本:(使用Newtonsoft.dll的jsonconvert方法转换为json字符串)public partial class index : System.Web.UI.Page
List&object& lists = new List&object&();
string result = "";
protected void Page_Load(object sender, EventArgs e)
string method = Request.QueryString["method"];
if (!string.IsNullOrEmpty(method))
if (method == "getdata")
private void data()
lists = new List&object&();
var obj = new { names = "yuan", nums = 12 };
var obj1 = new { names = "yuan1", nums = 19 };
lists.Add(obj);
lists.Add(obj1);
object JSONObj = (Object)JsonConvert.SerializeObject(lists);
Response.Write(JSONObj);
一定要加,不然前端接收失败
Response.End();
}2.2利用ashx:(利用javascriptSerializer进行序列化传输)public class Handler : IHttpHandler {
JavaScriptSerializer jsS = new JavaScriptSerializer();
List&object& lists = new List&object&();
string result = "";
public void ProcessRequest (HttpContext context) {
context.Response.ContentType = "text/plain";
string method = context.Request["method"];
if (!string.IsNullOrEmpty(method))
if (method == "getdata")
lists = new List&object&();
var obj = new { names = "yuan", nums =12
var obj1 = new { names = "yuan1", nums = 19 };
lists.Add(obj);
lists.Add(obj1);
jsS = new JavaScriptSerializer();
result = jsS.Serialize(lists);
context.Response.Write(result);
//context.Response.Write("Hello World");
public bool IsReusable {
}最终效果:
阅读(...) 评论()<span style="color: #//定义结构体[连接PLC所需参数]<span style="color: #public&struct&PLCConnParam&<span style="color: #{<span style="color: #&&&&public&byte&A&&&&&&&&&&&//&定义CPU的MPI/DP地址<span style="color: #&&&&//public&byte&SegmentId;&&& //&保留为0<span style="color: #&&&&public&byte&R&&&&&&&&&&&&&//&定义CPU的机架号<span style="color: #&&&&public&byte&S&&&&&&&&&&&&&&//&定义CPU的槽号<span style="color: #}2.2 PLC存储区域类别编号
&1//定义枚举类型[PLC的存储区域编号]&2public&enum&PLCBlockType&3{&4&&&&I&=&<span style="color: #,&//Input&bytes&5&&&&Q&=&<span style="color: #,&//Output&bytes&6&&&&M&=&<span style="color: #,&//Flag&bytes&7&&&&T&=&<span style="color: #,&//Timer&words&8&&&&Z&=&<span style="color: #,&//Counter&words&9&&&&D&=&<span style="color: #,&//Data&from&DB<span style="color: #}三.常用函数详细讲解3.1 建立PLC连接函数&&&&&首先从W95_S7.DLL中导入连接函数,访问权限为私有,C#将会对此函数进行封装,供外部调用,稍后讲解.
<span style="color: #/**////&&summary&与PLC建立连接,该函数必须在其他所有函数调用之前被调用<span style="color: #///&&/summary&<span style="color: #///&&param&name="nr"&连接数,在DOS,WIN3.1最多可以有4个,在WIN95以上最多可以有16个&/param&<span style="color: #///&&param&name="device"&与PLC通讯的设备名称,一般为S7ONLINE&/param&<span style="color: #///&&param&name="adr_table"&参数列表,4个值分别为MPI/DP地址,保留值=0,槽号,机架号&/param&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&load_tool(byte&nr,&string&device,&byte[,]&adr_table);说明:&&&&& 在一个MPI/DP网络中若有多个PLC时,可指定多个连接列。最后一列的所有参数须置0,以标志参数列结束。例如一个MPI/DP网中有两个PLC,他们的MPI地址分别为2和3,槽号均为2,机架号均为0,则可按如下方式调用:byte[,] ba={{2,0,2,0},{3,0,2,0},{0,0,0,0}};& int err=load_tool(1, "s7online",ba); 返回值为int型,如果返回0则表示执行成功,非零值,则需要根据错误号查找到错误具体信息,具体参照本文第五部分:错误代码字典&&&&& 当然如果PLC使用的是DP网络时,只需要将Set PG/PC Interface中接口参数分配选为PLCSIM(PROFIBUS)即可,Prodave不需要做任何修改(当然PLC地址肯定也是DP口的地址哦),具体如下图:个人不太习惯西门子的这种函数命名,索性就按照C#的常用习惯,进行一下简单的封装,供外部调用.
&1/**////&&summary&建立连接,同一个连接只容许调用一次&2///&&/summary&&3///&&param&name="connNo"&连接号connNo为1-4&/param&&4///&&param&name="connParam"&连接参数,PLCConnParam定义的参数结构体&/param&&5///&&returns&返回10进制错误号,0表示没有错误&/returns&&6public&static&int&Open(byte&connNo,&PLCConnParam[]&connParam)&7{&8&&&&int&PLCCPUCnt&=&connParam.L&9&&&&if&(PLCCPUCnt&&=&<span style="color: #)&//传递参数不正确<span style="color: #&&&&{<span style="color: #&&&&&&&&return&-<span style="color: #;<span style="color: #&&&&}<span style="color: #&&&&byte[,]&btr&=&new&byte[PLCCPUCnt&+&<span style="color: #,&<span style="color: #];&//多分配1个,用于存放0作为连接结束标记<span style="color: #&&&&//转换连接表<span style="color: #&&&&for&(int&i&=&<span style="color: #;&i&&&connParam.L&i++)<span style="color: #&&&&{<span style="color: #&&&&&&&&btr[i,&<span style="color: #]&=&connParam[i].A<span style="color: #&&&&&&&&btr[i,&<span style="color: #]&=&<span style="color: #;<span style="color: #&&&&&&&&btr[i,&<span style="color: #]&=&connParam[i].S<span style="color: #&&&&&&&&btr[i,&<span style="color: #]&=&connParam[i].R<span style="color: #&&&&}<span style="color: #&&&&btr[connParam.Length,&<span style="color: #]&=&<span style="color: #;<span style="color: #&&&&btr[connParam.Length,&<span style="color: #]&=&<span style="color: #;<span style="color: #&&&&btr[connParam.Length,&<span style="color: #]&=&<span style="color: #;<span style="color: #&&&&btr[connParam.Length,&<span style="color: #]&=&<span style="color: #;<span style="color: #&&&&//调用初始化函数,打开连接<span style="color: #&&&&int&errCode&=&load_tool(connNo,&"S7ONLINE",&btr);<span style="color: #&&&&return&errC<span style="color: #}&&& 建立于PLC的连接,只需在数采程序启动的时候调用即可,并且只能打开一次,否则报错. 驱动设备名称"S7ONLINE",一般情况下是不会有变化的,所以这里就写死了.特别需要指出的是,这个函数的第一个参数(连接号),是指当前连接有多少个PLC连接(严格意义上来讲,是CPU的个数,因为有可能2个PLC共用1个CPU,之间通过IM467组态),激活连接并交换数据的时候,和这个值有点关系. 在建立连接的时候默认激活第1个连接.3.2 断开与PLC的连接从W95_S7.DLL中导入函数,依然是私有,因为我要对所有的导入函数进行封装.
<span style="color: #/**////&&summary&断开与PLC的连接,必须退出数采软件之前调用,否则PLC的连接一直被占用,影响下次连接<span style="color: #///&&/summary&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&unload_tool();关闭PLC的连接函数进行C#封装,没有改变任何代码,只是换了个函数名.
<span style="color: #public&static&int&Close()<span style="color: #{<span style="color: #&&&&return&unload_tool();<span style="color: #}3.3 激活连接,当前连接列中某个时刻有且只有1个PLC是激活状态.建立连接的时候,默认激活第1个连接.
<span style="color: #/**////&&summary&激活与MPI网中的哪个CPU通讯,load_tool后默认激活第一个CPU连接<span style="color: #///&&/summary&<span style="color: #///&&param&name="no"&连接号,对应于参数adr_table所传递的连接参数顺序&/param&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号,若激活的连接在MPI网中没有,则返回错误号517&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&new_ss(byte&no);&&&&& 其参数与load_tool中参数adr_table所传递的连接参数顺序对应譬如byte[,] btr={{2,0,2,0},{3,0,2,0},{0,0,0,0}} , new_ss(1)则激活第1个连接即与MPI地址为2的PLC通讯,类似的new_ss(2)则激活与MPI地址为3的PLC通讯,在数采系统中,为了读取所有PLC的数据,采用定时循环激活每个PLC的连接,然后读取其数据.C#封装如下:
<span style="color: #public&static&int&ActiveConn(int&connNO)<span style="color: #{<span style="color: #&&&&return&new_ss((byte)connNO);<span style="color: #}3.4 从DB块中读取字节数据(返回BYTE数组)
<span style="color: #/**////&&summary&从DB中读取BYTE数组(字节数可以是任意长度的)<span style="color: #///&&/summary&<span style="color: #///&&param&name="blockno"&DB块号&/param&<span style="color: #///&&param&name="no"&DBB起始编号,0表示DBB0,1表示DBB1,跨度为BYTE&/param&<span style="color: #///&&param&name="amount"&读取的BYTE长度(任意长度,可以为奇数)&/param&<span style="color: #///&&param&name="buffer"&返回值,BYTE型buffer&/param&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&d_field_read(int&blockno,&int&no,&int&amount,&byte[]&buffer);C#封装如下:
&1/**////&&summary&读取DB块的BYTE数据&2///&&/summary&&3///&&param&name="DBBlockNO"&DB块号,如:DB2&/param&&4///&&param&name="DBBNO"&DB数据的起始字节,如DBB2则从2开始读&/param&&5///&&param&name="DBByteAmount"&要读取的字节数,如从DBB2--DBB5,共4个字节&/param&&6///&&param&name="buffer"&BYTE型缓存区,存储读取的数据&/param&&7///&&param&name="StartIndex"&数据缓存区的起始位置&/param&&8///&&returns&返回值&0:成功&&非0:错误代码&/returns&&9public&static&int&GetDBByteData(int&DBBlockNO,&int&DBBNO,&int&DBByteAmount,&byte[]&buffer,&int&StartIndex)<span style="color: #{<span style="color: #&&&&byte[]&bBufTemp&=&new&byte[DBByteAmount];<span style="color: #&&&&int&errCode=d_field_read(DBBlockNO,&DBBNO,&DBByteAmount,&bBufTemp);<span style="color: #&&&&for(int&i=<span style="color: #;i&DBByteAi++)<span style="color: #&&&&{<span style="color: #&&&&&&&&buffer[i+StartIndex]&=&bBufTemp[i]&;<span style="color: #&&&&}<span style="color: #&&&&return&errC<span style="color: #}&&&&& 这个函数是用的最多的一个函数,在数采系统中,习惯一次性的将所有需要用到数据,全部读到字节数组中,统一处理,避免不同时期凌乱读取造成的数据不一致.需要提醒的是,必须保证数据处理函数得到的数据,是PLC一次扫描周期内的.3.5 从DB中读取整数值(int32型)
<span style="color: #/**////&&summary&从DB中读取INT数据(DBW:INT16&或者&DBD:INT32),最多4个字节的整数<span style="color: #///&&/summary&<span style="color: #///&&param&name="dbno"&DB块号&/param&<span style="color: #///&&param&name="dwno"&DBW起始编号,0表示DBW0,1表示DBW2,跨度为WORD&/param&<span style="color: #///&&param&name="anzahl"&读取的WORD长度(1个WORD==2个BYTE)&2:DBW&,&4:DBD&/param&<span style="color: #///&&param&name="buffer"&返回值,int型整数(十进制)&/param&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&db_read(int&dbno,&int&dwno,&ref&int&anzahl,&ref&int&buffer);C#封装
&1/**////&&summary&从DB块中读取整型数据&2///&要读取DB2.DBW6,则DB块号为2,DBB号为6,字节长度为2&3///&要读取DB2.DBD6,则DB块号为2,DBB号为6,字节长度为4&4///&&/summary&&5///&&param&name="DBBlockNO"&DB块号,如:DB2&/param&&6///&&param&name="DBBNO"&DBB的起始字节号,如DBW2则从2开始读,由于是WORD(2个BYTE),DBB号必须为偶数&/param&&7///&&param&name="DBByteAmount"&要读取的BYTE数,必须是偶数(这里只能是2和4,在PLC中只有DBW,DBD两种整数)&/param&&8///&&param&name="buffer"&INT32型缓存区,存储读取的十进制数据&/param&&9///&&returns&返回值&0:成功&&非0:错误代码&/returns&<span style="color: #public&static&int&GetDBInt32Data(int&DBBlockNO,&int&DBBNO,&int&DBByteAmount,&ref&int&buffer)<span style="color: #{<span style="color: #&&&&int&DBWNO&=&DBBNO&/&<span style="color: #;<span style="color: #&&&&int&DBWordAmount&=&DBByteAmount&/&<span style="color: #;<span style="color: #&&&&int&errCode&=&db_read(DBBlockNO,&DBWNO,&ref&DBWordAmount,&ref&buffer);<span style="color: #&&&&byte[]&bbuf&=&new&byte[<span style="color: #];<span style="color: #&&&&GetByteFromInt32(buffer,&bbuf,&true);<span style="color: #&&&&buffer&=&bbuf[<span style="color: #]&*&<span style="color: #x1000000&+&bbuf[<span style="color: #]&*&<span style="color: #x10000&+&bbuf[<span style="color: #]&*&<span style="color: #x100&+&bbuf[<span style="color: #];<span style="color: #&&&&return&errC<span style="color: #}这个函数读取的是一个整数,因为DB中有DBB,DBW,DBD3种数据类型,最大的DBD是4个字节,所以设计了这个函数,读取单个的整型值,不用再进行BYTE[]到INT的转换了.这里值得一提的是整数高位优先,还是低位优先的问题,字节数组的顺序切记要矫正,另外buffer&=&bbuf[<span style="color: #]&*&<span style="color: #x1000000&+&bbuf[<span style="color: #]&*&<span style="color: #x10000&+&bbuf[<span style="color: #]&*&<span style="color: #x100&+&bbuf[<span style="color: #];这行代码很有意思,16进制的字节进位是0x100.3.6 M,I,Q 3种块的读取函数类似(参数都是一样的),这里放在一起进行说明M区读取函数
<span style="color: #/**////&&summary&读取PLC中的M字节数据<span style="color: #///&&/summary&<span style="color: #///&&param&name="no"&指定M字节号,譬如要读取MB10的值,则指定no等于10&/param&<span style="color: #///&&param&name="anzahl"&指定读取的字节数,譬如需要读取MB10至MB14之间的值,则可指定为5&/param&<span style="color: #///&&param&name="buffer"&返回获取的值,这是一个十进制的值,如果需要获取某一个M位的状态,需要把它转换成二进制&/param&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&m_field_read(int&no,&int&anzahl,&byte[]&buffer);I区读取函数,一直不明白为什么输入区(单词input)简称为I,而函数名却为A, 后来才晓得,这个A是德文的表示方法,(Pordave是西门子公司的东东).
<span style="color: #/**////&&summary&读取Output值<span style="color: #///&&/summary&<span style="color: #///&&param&name="no"&QB号&/param&<span style="color: #///&&param&name="anzahl"&读出多少个QB字节&/param&<span style="color: #///&&param&name="buffer"&返回读出的值,十进制&/param&<span style="color: #///&&returns&<span style="color: #正常返回,非0为错误号&/returns&<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&a_field_read(int&no,&int&anzahl,&byte[]&buffer);Q区读取函数,参数与I一样.
<span style="color: #[DllImport("w95_s7.dll")]<span style="color: #private&extern&static&int&e_field_read(int&no,&int&anzahl,&byte[]&buffer);C#封装,& M,I,Q 3种块的读取函数类似,这里放在一个函数里,利用枚举类型PLCBlockType进行区分
&1/**////&&summary&从M,I,Q区中读取字节数组&2///&&/summary&&3///&&param&name="blockType"&Block类别,在枚举PLCBlockType中定义,如要读取M区的值,则blockType=PLCBlockType.M&/param&&4///&&param&name="BlockNO"&区号,如IB10,MB10&/param&&5///&&param&name="ByteAmount"&要读取的字节数量,如IB10--IB14共5个字节&/param&&6///&&param&name="bbuf"&byte[]类型的buffer&/param&&7///&&param&name="StartIndex"&byte[]存储的起始位置&/param&&8///&&returns&<span style="color: #正常返回,非0为错误号&/returns&&9public&static&int&GetMIQByteData(PLCBlockType&blockType,&&int&BlockNO,&int&ByteAmount,&byte[]&bbuf,&int&StartIndex)<span style="color: #{<span style="color: #&&&&int&errCode&=&<span style="color: #;<span style="color: #&&&&byte[]&bBufTemp&=&new&byte[ByteAmount];&//局部变量,不用担心内存释放的问题.&C++程序员看到"new"估计很谨慎.<span style="color: #&&&&switch&(blockType)&//根据块类别,调用相应的块读取函数.<span style="color: #&&&&{<span style="color: #&&&&&&&&case&PLCBlockType.M:&errCode&=&m_field_read(BlockNO,&ByteAmount,&bBufTemp);&break;<span style="color: #&&&&&&&&case&PLCBlockType.I&:&errCode&=&e_field_read(BlockNO,&ByteAmount,&bBufTemp);&break;<span style="color: #&&&&&&&&case&PLCBlockType.Q:&errCode&=&a_field_read(BlockNO,&ByteAmount,&bBufTemp);&break;<span style="color: #&&&&}<span style="color: #&&&&for&(int&i&=&<span style="color: #;&i&&&ByteA&i++)&&//由于C#中对指针有所限制,从数组指定的起始位置,逐个赋值.<span style="color: #&&&&{<span style="color: #&&&&&&&&bbuf[i&+&StartIndex]&=&bBufTemp[i];<span style="color: #&&&&}<span style="color: #&&&&return&errC<span style="color: #}四, BYTE,INT,BOOL几种类型的数据转换函数4.1 从32位整数中提取字节数组(4个byte)
&1/**////&&summary&从INT32型数据中提取byte字节数组&2///&&/summary&&3///&&param&name="lbuf"&源数据(long型)&/param&&4///&&param&name="bbuf"&字节数组,存放提取的Byte数据&/param&&5///&&param&name="startIndex"&起始位置&/param&&6///&&param&name="ByteAmount"&提取的字节数&/param&&7///&&param&name="isBigEndian"&long型源数据是否高位优先,如果不是,则进行反向提取&/param&&8public&static&void&GetByteFromInt32(int&ibuf,&byte[]&bbuf&,&bool&isBigEndian)&9{<span style="color: #&&&&if&(isBigEndian)&//高位优先,则反向提取.<span style="color: #&&&&{<span style="color: #&&&&&&&&for&(int&i&=&<span style="color: #;&i&&=<span style="color: #;&i++)&//Int32只有4个字节<span style="color: #&&&&&&&&{<span style="color: #&&&&&&&&&&&&bbuf[i]&=&(byte)(ibuf&&&<span style="color: #x000000ff);&//取低位字节<span style="color: #&&&&&&&&&&&&ibuf&&&=&<span style="color: #;&&//右移8位<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #&&&&else&//低位优先,按顺序提取.<span style="color: #&&&&{<span style="color: #&&&&&&&&for&(int&i&=&<span style="color: #;&i&&=&<span style="color: #;&i--)<span style="color: #&&&&&&&&{<span style="color: #&&&&&&&&&&&&bbuf[i]&=&(byte)(ibuf&&&<span style="color: #x000000ff);<span style="color: #&&&&&&&&&&&&ibuf&&&=&<span style="color: #;<span style="color: #&&&&&&&&}<span style="color: #&&&&}<span style="color: #}4.2 从字节数据中提取bit数组(8个bit),以bool型数据代替位表示.
&1/**////&&summary&从Byte数据中取得所有bit的值(1Byte=8Bit&,&false:0&,&true:1)&2///&&/summary&&3///&&param&name="byteData"&源数据(Byte型),其中的8个bit位,从右到左0--7编号&/param&&4///&&param&name="bitArray"&bit数组,存放Byte中的8个bit的值,0:false,&1:true&/param&&5///&&param&name="startIndex"&在bit数组中存放的起始位置&/param&&6public&static&void&GetBitFromByte(byte&byteData,&bool[]&bitArray,&int&startIndex)&7{&8&&&&byte[]&byteArray&=&new&byte[<span style="color: #];&9&&&&byteArray[<span style="color: #]&=&byteD<span style="color: #&&&&System.Collections.BitArray&BA&=&new&System.Collections.BitArray(byteArray);<span style="color: #&&&&for&(int&i&=&<span style="color: #;&i&&=&<span style="color: #;&i++)&//依次取8个位,逐个赋值<span style="color: #&&&&{<span style="color: #&&&&&&&&bitArray[startIndex&+&i]&=&BA.Get(i);<span style="color: #&&&&}<span style="color: #}4.3 从字节数据中提取某一位的状态,以bool型返回
&1/**////&&summary&从Byte数据中取得某一位bit的值(false:0&,&true:1)&2///&&/summary&&3///&&param&name="byteData"&源数据(Byte型),其中的8个bit位,从右到左0--7编号&/param&&4///&&param&name="bitNo"&bit位编号,从右到左以0--7编号&/param&&5///&&param&name="bitData"&bit值,以bool型返回,false:0&,&true:1&/param&&6public&static&void&GetBitFromByte(byte&byteData,&int&bitNo,&ref&bool&bitData)&7{&8&&&&if&(bitNo&&=&<span style="color: #&&&&bitNo&&=&<span style="color: #)&//位号必须在0~7之间&9&&&&{<span style="color: #&&&&&&&&byte[]&byteArray&=&new&byte[<span style="color: #];<span style="color: #&&&&&&&&byteArray[<span style="color: #]&=&byteD<span style="color: #&&&&&&&&System.Collections.BitArray&BA&=&new&System.Collections.BitArray(byteArray);<span style="color: #&&&&&&&&bitData&=&BA.Get(bitNo);<span style="color: #&&&&}<span style="color: #}五.错误代码字典
&1/**////&&summary&根据错误代码返回错误信息&2///&例如int&errCode=ActiveConn(1);&&sring&errInfo&=&GetErrInfo(err);&3///&&/summary&&4///&&param&name="errCode"&错误码&/param&&5///&&returns&错误信息&/returns&&6public&static&string&GetErrInfo(int&errCode)&7{&8&&&&switch&(errCode)&9&&&&{<span style="color: #&&&&&&&&case&-<span style="color: #:&return&"User-Defined&&Error!";&&//自定义错误,主要是参数传递错误!<span style="color: #&&&&&&&&case&<span style="color: #x0000:&return&"Success";<span style="color: #&&&&&&&&case&<span style="color: #x0001:&return&"Load&dll&failed";<span style="color: #&&&&&&&&case&<span style="color: #x00E1:&return&"User&max";<span style="color: #&&&&&&&&case&<span style="color: #x00E2:&return&"SCP&entry";<span style="color: #&&&&&&&&default:&return&"Unkonw&error";<span style="color: #&&&&}<span style="color: #}&&&&& 由于错误代码比较多,这里只罗列了几个,详细信息请下载源代码进行查看,这里不再详述.六. DCProdave.cs应用举例&&&&& 为保证数据的一致性,可以使用一个定时器,触发时间设为PLC扫描周期,在其触发事件中,把需要用到的PLC变量一次性读取.建立与PLC的连接,示例如下
<span style="color: #PLCConnParam[]&Conn=new&PLCConnParam[<span style="color: #];&//MPI网中有2个PLC,地址分别为2,3<span style="color: #Conn[<span style="color: #]&.Addres=<span style="color: #;&&Conn[<span style="color: #].Slot=<span style="color: #;&&Conn[<span style="color: #].Rack=<span style="color: #;&&<span style="color: #Conn[<span style="color: #]&.Addres=<span style="color: #;&&Conn[<span style="color: #].Slot=<span style="color: #;&&Conn[<span style="color: #].Rack=<span style="color: #;<span style="color: #errCode=&DCProdave.Open(<span style="color: #,Conn);&&//建立连接<span style="color: #errCode=&DCProdave.ActiveConn(<span style="color: #);&//激活第一个连接<span style="color: #errCode=&DCProdave.GetDBByteData(<span style="color: #,&<span style="color: #,&<span style="color: #,&buf,&<span style="color: #);&//DB2.DBW0--DBW5&共6个字节的变量,从buf的0位存储<span style="color: #if(errCode!=<span style="color: #){//DCLog.Write(DCProdave.GetErrInfo(errCode),"log.txt");}//如果返回值不=0,则将错误写入日志还有很多往PLC写入数据的函数,这里没有介绍,文中有很多不足之处,欢迎希望路过的各位XDJM在此留言.邮箱:

我要回帖

更多关于 intouch控件 的文章

 

随机推荐