一、Modbus Tcp

以下指令均为16进制数。

1.读多个地址。
0000 0000 0006 01 03 0001 0010
0000:事务标识符(2字节) ,没有特别定义;
0000:协议标识符(2字节) ,MODBUS协议的场合为0000H;
0006:长度(2字节),后面所跟的字节长度;
01 :单元标识符(1字节),站号,或者说机器地址;
03:功能(1字节) ,请指定功能代码;(功能代码补充:03读多个地址,06写单个地址,10写多个地址)
0001:起始数据地址;
0010:读个数。

2.写单个地址。
0000 0000 0006 01 06 00FF 000A
0000:事务标识符(2字节) ,没有特别定义;
0000:协议标识符(2字节) ,MODBUS协议的场合为0000H;
0006:长度(2字节),后面所跟的字节长度;
01 :单元标识符(1字节),站号,或者说机器地址;
06:功能(1字节) ,请指定功能代码;(功能代码补充:03读多个地址,06写单个地址,10写多个地址)
00FF:写入地址;
000A:写入数据。

3.写多个地址。
0000 0000 000B 01 10 0001 0002 04 000A 000B
0000:事务标识符(2字节) ,没有特别定义;
0000:协议标识符(2字节) ,MODBUS协议的场合为0000H;
000B:长度(2字节),后面所跟的字节长度;
01 :单元标识符(1字节),站号,或者说机器地址;
10:功能(1字节) ,请指定功能代码;(功能代码补充:03读多个地址,06写单个地址,10写多个地址)
0001:起始数据地址;
0002:写个数;
04:字节数,写个数*2;
000A:写入数据1;
000B:写入数据2。

二、Modbus RTU
以下指令均为16进制数。
1.读多个地址。
01 03 0001 0010 15C6
01 :机器地址;
03:功能代码;(功能代码补充:03读多个地址,06写单个地址,10写多个地址)
0001:起始数据地址;
0010:读个数;
15C6:校验代码(CRC)。

2.写单个地址。
01 06 00FF 000A 39FD
01 :机器地址;
06:功能代码;(功能代码补充:03读多个地址,06写单个地址,10写多个地址)
00FF:写入地址;
000A:写入数据;
39FD:校验代码(CRC)。

3.写多个地址。
01 10 0001 0002 04 000A 000B 53A6
01 :单元标识符(1字节),站号,或者说机器地址;
10:功能(1字节) ,请指定功能代码;(功能代码补充:03读多个地址,06写单个地址,10写多个地址)
0001:起始数据地址;
0002:写个数;
04:字节数,写个数*2;
000A:写入数据1;
000B:写入数据2;
53A6:校验代码(CRC)。

在开发中涉及数采部分,部分PLC的元软件地址是用16进制标识的。
例如三菱的 M1F 这样,同步时上位机端保存最好也同样记录一样名字的地址,这里就需要16进制的加减运算。
最简单的计算方式是:

(Convert.ToInt32(saddr, 16) + inc).ToString("x").ToUpper();

拓展开来,要是需要进行一个任意长度的16进制加法呢,找了一下网上也没看到有比较好的操作。
检查梳理一下思路,就是从低位到高位逐位相加,然后有进位的参与后边运算,代码如下

 public string HexAdd(string first, string second) {
    var src = first.ToCharArray();
    var des = second.ToCharArray();
    char[] res;
    if (src.Length < des.Length) {
        res=HexAddByChars(des.Reverse().ToArray(), src.Reverse().ToArray());
    } else {
        res=HexAddByChars(src.Reverse().ToArray(), des.Reverse().ToArray());
    }
    return res != null ? string.Concat(res.Reverse()) : string.Empty ;
}

public string HexAdd(string saddr, int inc) {
    return (Convert.ToInt32(saddr, 16) + inc).ToString("x");
}

private char[] HexAddByChars(char[] a, char[] b) {
    var res = new char[a.Length];
    var padd = 0;
    for (var i =0; i< a.Length; i++) {
        if (i >= b.Length) {
            res[i] = HexAddByChar(a[i], Convert.ToChar(padd.ToString()), out padd);
            padd = 0;
        } else {
            if (padd > 0) { //低位结果有进位运算时
                var sa = HexAdd(a[i].ToString(), padd);
                var re = HexAdd(sa, b[i]);
                if (re.Length > 1) {
                    padd = int.Parse(re.Substring(0, 1));
                    res[i] = Convert.ToChar(re.Substring(1));
                } else {
                    res[i] = Convert.ToChar(re);
                }
            } else {
                res[i] = HexAddByChar(a[i], b[i], out padd);
            }
        }
    }
    return res;
}
private char HexAddByChar(char a, char b, out int padd) {
    padd = 0;
    var tres = b=='\0'?a.ToString(): (Convert.ToInt32(a.ToString(),16) + Convert.ToInt32(b.ToString(),16)).ToString("x");
    if (tres.Length > 1) {
        padd = int.Parse(tres.Substring(0, 1));
    }
    return Convert.ToChar(tres.Length>1?tres.Substring(1):tres);
}

注意:运算需要从低位往高位推进,所以上边操作将16进制字符串分拆成数组后,需要先逆序再操作,操作完再逆序保存回来。

总结微信支付异步通知notify_url的数据逻辑
1、微信的异步通知是XML,需要处理后才能转成json方便使用;
2、验签用到的key是商户后台 pay.weixin.qq.com 里边的apikey;
3、验签时,前边下单时透传到异步url参数里边的所有非标参数,均不能参与验签运算否则验签失败。

上码:

<?php
ini_set('date.timezone', 'Asia/Shanghai');
error_reporting(E_ERROR);

function wlog($str){
    //追加方式记录文件,模式w 为覆盖重写
    $myfile = fopen("/data/log/wxpayrecs.log", "a") or die("Unable to open file!");
    fwrite($myfile,  date('y-m-d H:i:s').$str."\r\n");
    fclose($myfile);
}

$susretstr='<xml><return_code><![CDATA[SUCCESS]]></return_code><return_msg><![CDATA[OK]]></return_msg></xml>';
$failretstr='<xml><return_code><![CDATA[FAIL]]></return_code><return_msg><![CDATA[]]></return_msg></xml>';

$inBody = file_get_contents('php://input');     //获取数据流
//样例数据 {"appid":"wx5c48****9f1","bank_type":"BOC_DEBIT","cash_fee":"1","fee_type":"CNY","is_subscribe":"Y","mch_id":"152****81",
//"nonce_str":"349217E0F*****1C8C249","openid":"oNvy-*****0SBLI","out_trade_no":"20210*****111",
//"rd":"704","result_code":"SUCCESS","return_code":"SUCCESS","sign":"5E828DF2933BED7E2B2F3BFF3F944CED","time_end":"20230208110409",
//"total_fee":"1","trade_type":"NATIVE","transaction_id":"420000******5576"}

if(empty($inBody)){     //没有发送数据流,可能是普通点击,直接无视为成功访问
    exit($susretstr);
}
//wlog(' Body:   '.str_replace("\n","",$inBody));     //调试阶段写日志

$xml=simplexml_load_string($inBody,'SimpleXMLElement', LIBXML_NOCDATA);
$result=json_decode(json_encode($xml),true);

if(empty($result["sign"])){   //缺少签名,直接失败
    exit("fail");
}
if($result['return_code'] == 'SUCCESS' && $result['result_code'] == 'SUCCESS') {
    $Signature=$result['sign'];
    //验签,todo 前边下单增加的透传参数不能参与验签
    unset($result['sign'],$result['rd']);
    //todo 这里可能需要增加sort排序操作
    $s_src= http_build_query($result).'&key=51930******70D';

    //wlog($s_src);
    $vsign=strtoupper(md5($s_src));

    if($Signature==$vsign){
        wlog(' 支付验签 ok');
        //todo 根据交易id,设置数据库交易未已成功

        $out_trade_no=$result["out_trade_no"];
        exit($susretstr);
    }else{
        wlog(' 验签失败 '.$vsign);
        exit($failretstr);
    }
}else{
    exit($failretstr);
}


一直都觉得Windows的更新服务很烦人,因为一次优化类的软件做了特别的操作修改注册表,导致控制面板--管理工具--服务--Windows 更新---无法启动。

解决办法:

按“win+R”或者点击开始菜单,找到运行,在运行输入框里面输入“regedit”进入注册表,然后在注册表找到HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\wuauserv(我的这个在注册表的最下面)

对目录wuauserv右键选择权限--高级--看到所有者--更改--弹出框选择“高级”--弹出框--立即查找--选择中“administrators”--把完全控制打上对号--确定应用

直接上代码,实现功能:程序通过代码修改了config文件后,自动触发重启。

string txtServerIPs = ConfigurationManager.AppSettings["SeverIp"];
string txtSeverPorts = ConfigurationManager.AppSettings["SeverPort"];

//获取Configuration对象
Configuration config = System.Configuration.ConfigurationManager.OpenExeConfiguration(ConfigurationUserLevel.None);
config.AppSettings.Settings["SeverIp"].Value = txtServerIP.Text;
config.AppSettings.Settings["SeverPort"].Value = txtSeverPort.Text;
config.Save(ConfigurationSaveMode.Modified);
ConfigurationManager.RefreshSection("appSettings");

MessageBox.Show("修改成功,程序将重新启动。");

Application.ExitThread();
Application.Exit();
Application.Restart();

作为一个程序猿,日常使用谷歌浏览器Chrome,必须配备几个有效的扩展
1、AdBlock 广告屏蔽,对于经常被各种广告围绕的人来说,这个可有用了
下载AdBlock

2、NoScript 禁用脚本,很多页面连接了其他各种无效网站的脚本,都是可以屏蔽的,例如浮动广告等
下载NoScript

3、JSONViewer 分层分前后台开发时,对于后端输出的接口调试,Json的格式化就是一个便捷的开端了。
下载JSONViewer

4、Vue.js 前段开发调试神器
下载VuejsDevtools

5、UserAgentswitcher UA模拟,对于测试开发各种终端兼容性的站点,UserAgentswitcher可以快速实现终端的模拟效果
下载UserAgentswitcher

Adobe全家福icons

PS 图片制作,编辑,后期处理修饰
Adobe Photoshop是由AdobeSystems开发和发行的图像处理软件。
Photoshop主要处理以像素所构成的数字图像。使用其众多的编修与绘图工具,可以有效地进行图片编辑工作。ps有很多功能,在图像、图形、文字、视频、出版等各方面都有涉及。
Adobe支持Windows操作系统、Andriod与Mac OS, 但Linux操作系统用户可以通过使用Wine来运行Photoshop。

AI 矢量图形和插图
Adobe illustrator是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。
它是一款专业图形设计工具,提供丰富的像素描绘功能以及顺畅灵活的矢量图编辑功能,能够快速创建设计工作流程。借助Expression Design,可以为屏幕/网页或打印产品创建复杂的设计和图形元素。它支持许多矢量图形处理功能,拥有很多拥护者,也经历了时间的考验,因此人们不会随便就放弃它而选用微软的Expression Design。它提供了一些相当典型的矢量图形工具,诸如三维原型(primitives)、多边形(polygons)和样条曲线(splines),一些常见的操作从这里都能被发现。

Pr 视频编辑
Adobe Premiere,是一款常用的视频编辑软件,由Adobe公司推出。
现在常用的版本有CS4、CS5、CS6、CC、CC 2014、CC 2015、CC 2017以及CC2018版本。Adobe Premiere是一款编辑画面质量比较好的软件,有较好的兼容性,且可以与Adobe公司推出的其他软件相互协作。目前这款软件广泛应用于广告制作和电视节目制作中。
Premiere Pro是视频编辑爱好者和专业人士准备的必不可少的编辑工具。它可以提升创作能力和创作自由度,它是易学、高效、精确的视频剪辑软件。Premiere提供了采集、剪辑、调色、美化音频、字幕添加、输出、DVD刻录的一整套流程,并和其他Adobe软件高效集成,使足以完成在编辑、制作、工作流上遇到的所有挑战,满足创建高质量作品的要求。

PL 视频编辑软
全称Adobe Prelude,是Adobe出品的一款专业级别的视频编辑软件。Adobe Prelude软件将卓越的性能、优美的改进用户界面和许多奇妙的创意功能结合在一起,包括用于动态时间轴裁切、扩展的多机编辑、调整图层等

DW 梦想编织者-网页开发编辑器
Adobe Dreamweaver,简称“DW”,中文名称 “梦想编织者”,最初为美国MACROMEDIA公司开发 ,2005年被Adobe公司收购。DW是集网页制作和管理网站于一身的所见即所得网页代码编辑器。利用对 HTML、CSS、JavaScript等内容的支持,设计师和程序员可以在几乎任何地方快速制作和进行网站建设。

FL Flash 动画播放器
Adobe Flash(原称Macromedia Flash,简称Flash;前身FutureSplash)是美国Macromedia公司(已被Adobe公司收购)所设计的一种二维动画软件。通常包括Adobe Flash,用于设计和编辑Flash文档,以及Adobe Flash Player,用于播放Flash文档。

ME 视频渲染软件
Media Encoder 是视频渲染软件,无缝连接到所有的Adobe视频制作软件,非常推荐使用这家伙来渲染:案例一、当你用AE昨晚一个视频,按了渲染,渲染到一半,然后卡死了,啊悲剧啊(这是一个真实的故事)如果直接放进ME里边渲染,AE不断不会死,还能继续操作;案例二、做一个视频渲染一次,渲染要等20分钟才行,再做第二个视频,费时间;用ME把AE队列导入,做一个导一个,晚上睡觉挂机渲染。

Br 集中管理您的创意资源
Adobe Bridge 是Adobe公司开发的一个组织工具程序。
从 Bridge 中可以查看、搜索、排序、管理和处理图像文件,还可以使用Adobe Bridge 来创建新文件夹、对文件进行重命名、移动和删除操作、编辑元数据、旋转图像以及运行批处理命令, 以及查看有关从数码相机导入的文件和数据的信息。

IC 文字编辑软件
ic全称“incopy”,是adobe公司开发的一款文字编辑软件,能帮助用户进行写作编辑排版,适用于作家、编辑与设计之间的协作,提高工作效率。
借助 InCopy 与 InDesign 之间的紧密集成,增强设计与编辑小组之间的协作。
利用 InCopy,文案人员和编辑可以设计文本样式、跟踪更改并对文档进行简单的版面修改,而设计人员可以同时在 Adobe InDesign 中处理同一文档,而不会覆盖对方的文稿。

Id 排版设计软件
Adobe InDesign是Adobe公司的一个 桌面出版 (DTP) 的应用程序,主要用于各种印刷品的排版编辑。该软件是直接针对其竞争对手QuarkXPress而发布的。虽然最初在争取用户方面面临了一些困难,但在2002年发布了Mac OS X版本后开始赶超其竞争对手。现在InDesign CS 和 CS2 也作为Creative Suite套件的重要组成部分,与Photoshop、Illustrator和Acrobat捆绑销售。

Lr 图形工具
Adobe Light Room,是一款由adobe公司开发的可以快速导入拍摄图片直接润色处理的软件。
Light room是一款重要的后期制作工具,支持各种RAW图像,主要用于数码相片的浏览、编辑、整理、打印等。Lightroom与Photoshop有很多相通之处,但定位不同,不会取而代之,并且Photoshop上的很多功能,如选择工具、照片瑕疵修正工具、多文件合成工具、文字工具和滤镜等Lightroom并没有提供。
Light room主要功能:
1、升级版修复画笔:仅需一笔即可清除分散的干扰元素,调整画笔的尺寸,并且沿着精确的路线移动,所有不想要的物品或者瑕疵都可以被清除。
2、Upright tool(垂直工具):仅需一点可以将图像分解成自动的水平视野,将建筑物状的物体直立,以纠正梯形畸变效应。
3、RadialGradient tool(径向型渐变工具):更灵活地突显照片中的重要元素,可以创造出偏离中心点效应,或者多重虚光效应。
4、Smart Previews(智能预览):通过创建名为 Smart Previews 的更小的替身文件,用户无需初始文件即可编辑图像。
5、写真集制作功能升级:能够更有效的制作与编排精致的写真集。Lightroom 提供了许多简单易用的写真集模版,你可以任意编辑这些模版,制作个性化的写真集,轻轻松松就能将做好的写真集上传打印。
6、Video slideshow(视频幻灯片):用户可以在一张高清视频幻灯片中融入静态影像,视频剪辑,与音乐,可以在任何一部电脑或设备上播放。

AE 电影视觉效果和动态图形
Adobe After Effects,是Adobe公司推出的一款图形视频处理软件,适用于从事设计和视频特技的机构,包括电视台、动画制作公司、个人后期制作工作室以及多媒体工作室。属于层类型后期软件。
Adobe After Effects软件可以帮助您高效且精确地创建无数种引人注目的动态图形和震撼人心的视觉效果。利用与其他Adobe软件无与伦比的紧密集成和高度灵活的2D和3D合成,以及数百种预设的效果和动画,为您的电影、视频、DVD和Macromedia Flash作品增添令人耳目一新的效果。
与PR对比:
AE(After Effects)是Premiere的兄弟产品,它是一套动态图形的设计工具和特效合成软件。
而Premiere是一款剪辑软件,用于视频段落的组合和拼接,并提供一定的特效与调色功能。Premiere和AE可以通过Adobe动态链接联动工作,满足日益复杂的视频制作需求。

AN 适用于多个平台的交互式动画
Adobe Animate是一款功能强大、操作简单、使用方便且专业的角色动画制作软件。它可以将Photoshop和Illustrator中的静态图像,或从软件中已有的某个木偶开始构建,通过摄像头和麦克风等辅助设备,与我们的面部表情相连接,让这些静态图像和角色可以随着我们的表情变化而产生相应的表情,让你的动画更加灵动。软件新增了很多功能,新的“触发器”面板、新“控件”面板、眉毛和眼睛动画改进、姿势至姿势动画、更好地对齐音频等等新功能,使在使用过程能够更加得心应手。
设计适合游戏、电视节目和 Web 的交互式动画。让卡通和横幅广告栩栩如生。创作动画涂鸦和头像。并向电子学习内容和信息图中添加动作。借助 Animate,您能以几乎任何格式将动画快速发布到多个平台并传送到观看者的任何屏幕上。

Ch 角色动画制作软件
Character Animator是一款功能强大、操作简单、使用方便且专业的角色动画制作软件,今年推出的最新版本软件,在功能上进行了改进和优化,使其功能性更加完善化,从而在使用过程中使软件实用性得到更好的利用和更加强大。
Character Animator 使用您的实时表情和动作让人物动起来。生成速度非常快,您可以边工作边进行直播,在制作过程的每一步都赢得观众的喝彩。

AU 录音,混音和复原
Adobe Audition是一个专业音频编辑和混合环境,原名为Cool Edit Pro. 被Adobe公司收购后,改名为Adobe Audition。Audition专为在照相室、广播设备和后期制作设备方面工作的音频和视频专业人员设计,可提供先进的音频混合、编辑、控制和效果处理功能。最多混合 128 个声道,可编辑单个音频文件,创建回路并可使用 45 种以上的数字信号处理效果。Audition 是一个完善的多声道录音室,可提供灵活的工作流程并且使用简便。

XD 一站式UX/UI设计平台
Adobe XD是一站式UX/UI设计平台,用户可以在此产品上进行移动应用程序、网页设计和原型制作。与此同时,它还是一个跨平台设计产品,结合了设计和建立原型的功能,同时提供了工业性能。

DN 3D设计软件
DN是(Dimension)软件的简称,是adobe公司新推出的一款3D设计软件,Adobe Dimension能与Adobe Photoshop以及Illustrator等软件紧密结合起来,而且模型、灯光、材质、渲染的操作都是非常容易上手。

Lrc 编辑和管理桌面照片
adobelrc是编辑和管理桌面照片的软件。adobelrc能在更短的时间内导入照片,生成预览并从库模块切换到开发人员模块,同时可以一步将多个曝光组合到多张hdr照片中,然后将它们缝制到全景照片中,从而更快地创建hdr全景照片。

近期在一个项目里边,用到了背景图片,后来在最大化/最小化时会出现应用在屏幕内不断闪屏情况。
通过查找资料,在构造函数内,增加了如下设置
SetStyle(ControlStyles.UserPaint, false);
SetStyle(ControlStyles.AllPaintingInWmPaint, true); // 禁止擦除背景.
SetStyle(ControlStyles.DoubleBuffer, true); // 双缓冲
SetStyle(ControlStyles.ResizeRedraw, true);

后来突然发现出现了一个很诡异的bug,只有部分控件的背景能正常显示,其他窗体的背景图片全部镂空了,效果如下。
半镂空bug
调试了很久,我甚至怀疑是不是自己写程序导致了,重新创建了新窗体,测试没问题,将旧窗体的代码逻辑拷贝过去,故障就复现。
再逐行走读代码,发现上述代码的第一句感觉有问题,修改称true,然后就ok了。

来源:http://blog.sina.com.cn/s/blog_13249c1060102vaj2.html

实现流程:
读图 ---> 阈值化 ---> 连通 ---> 填充 ---> 选择特征 ---> 结果

代码实现:
dev_close_window ()
read_image (Image, 'bolt.jpg')
get_image_pointer1 (Image, Pointer, Type, Width, Height)
dev_open_window (0, 0, Width, Height, 'black', WindowHandle)
dev_display (Image)
threshold (Image, Region, 0, 150)
connection (Region, ConnectedRegions)
fill_up (ConnectedRegions, RegionFillUp)
select_shape (RegionFillUp, SelectedRegions, ['area','circularity'], 'and', [1000,0.95], [5000,1.00])
dev_display(Image)
dev_display(SelectedRegions)