Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215

Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215
通讯分析笔记 by 小竹 – 扎老铁
Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215

Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215
Warning: mysqli_num_fields() expects parameter 1 to be mysqli_result, boolean given in /www/wwwroot/dev.zhalaotie.com/wp-includes/wp-db.php on line 3215
class="post-52917 post type-post status-publish format-standard hentry">

通讯分析笔记 by 小竹

Attention

客户方(厂商)的技术人员对于有些寄存器的解释笔记模糊,而且你问他他给你的回答不一定是100%准确的,可能存在遗漏或错误!

数据结构

线圈数量

线圈数*2 即为字节数,一个线圈=2字节byte

设备属性的定义有 StartAddress(此属性的寄存器的线圈开始地址) 和 CoilNum,则属性的EndAddress,通过 StartAddress + 线圈数 即可得到

字→16位开关量

寄存器多个值数据组合

另外测试过程发现,有写寄存器的数据,是两个 byte 存了两个数据项的,比如春季黎明时分,其数据是要把 2 个 byte 分别单独拆开,对应一个是小时,一个是分钟

/Users/laurel/Desktop/38366CCC-26C0-4AAF-9DDB-237912CFD37D.png

还有比如警报状态也是,这些类似这样的 月加日、时加分的外,

还有其它哪些是采用组合数据方式的寄存器?

比如:

春季月日

0320

秋季月日

0923

进制转换

还有就是

有的寄存器,读出来的是 10 进制的数据,比如光强 10 进制,没问题。

但是有的,读出来的是 16 进制的,需要做进制转换后才能正常显示,比如系统时间

需要做进制转换后才正常显示

转成 16 进制存储的,占用空间更小

16 转 10 (Convert.ToInt32,结果都是 10 进制,知识第二个参数,表示传入参数(第一个参数)的进制数)

Convert.ToInt32(“a”, 16) -> 10

10 转 16(16 进制 .NET 只能用 string 表示)

Convert.ToString(10, 16); -> a

Convert.ToString(35283258316578, 16) -> 201706141722

 

系统时间最特殊,不一样-

需要把读出来的值,转 进制

35283258316578 -》 201706141722

接口

连续写入

最大读取&写入线圈/字节数

// 南华的 DEMO 程序,是 120 线圈
// 我测试下来,读取可以 126 个线圈,超过就超时了,写入可以 125 个线圈,要注意不要写入“首次运行”属性,因为这个属性是控制出厂设置用的。

protected int maxReadCoilCount = 126;//126;

/// <summary>
/// 这里有个大坑,恢复出厂设置后,可写线圈数就变成了 120,如果超过 120,则会写入超时,但是平常状态下是无此问题的
/// </summary>
protected int maxWriteCoilCount = 120;//125;

广播连续写入

广播不但可以写入单个,也可连续写入。

设定启始写入的项目(00 07 表示在组项之后的寄存器),这样不会覆盖设备的组号和项号寄存器。

../../../../../Library/Containers/com.tencent.qq/Data/Library/Caches/Images/A4B149C932AB63BFCA1D09BB9A363B96.pn

定向广播连续写入(群组/组号/项号批量控制)

恢复出厂设置

请参见寄存器定义节的相关内容。

先读取设备的组&项号

批量控制/Screen%20Shot%202017-05-05%20at%204.24.30%20PM.png

用 demo 程序,发群组批量控制

项目要从组号的地址开始(00 05),切勿从 00 00 开始,那样会把所有灯的所有数据包括设备地址都改了,会导致设备连接不上及通讯异常

定向广播示例:

示例数据

组&项

03 分组,光强 100

00 03 00 03 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 03 01 06 01 09 01 12 01 00 00 20 17 05 05 16 25 00 10

00 00 00 00 00 96 00 01 00 00 00 2C 00 3C 00 A0 00 78 00 FF 00 3C 00 A0

00 0A 00 50 00 32 00 00 00 00 00 00 00 00 00 01 00 EE 00 02 00 00 00 00

00 00 00 00 00 00 00 EE 00 00 00 00 00 00 00 00 00 00 00 00 00 96 00 64

00 02 00 00 00 00 00 96 00 64 00 02 00 00 00 05 00 96 00 64 00 02 00 01

00 01 02 EE 00 64 00 02 00 00 00 20 00 20 00 00 00 00 00 EE 00 81 00 FF

00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 01 00 01 02 EE 00 64

00 02 00 63 00 00 00 00

项号 FF FF 传空值,表示没有值,即只要是组号相同,就符合条件

00 01 FF FF 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 03 01 06 01 09 01 12 01 00 00 20 17 05 05 16 25 00 10

00 00 00 00 00 96 00 01 00 00 00 2C 00 3C 00 A0 00 78 00 FF 00 3C 00 A0

00 0A 00 50 00 32 00 00 00 00 00 00 00 00 00 01 00 EE 00 02 00 00 00 00

00 00 00 00 00 00 00 EE 00 00 00 00 00 00 00 00 00 00 00 00 00 96 00 64

00 02 00 00 00 00 00 96 00 64 00 02 00 00 00 05 00 96 00 64 00 02 00 01

00 01 02 EE 00 64 00 02 00 00 00 20 00 20 00 00 00 00 00 EE 00 81 00 FF

00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 01 00 01 02 EE 00 64

00 02 00 63 00 00 00 00

备注

新版定向广播写入,modbus 底层通信api一致,只是设备处理的方式不一致了,

设备只更新写入输入的最后一个寄存器的值了,因此底层 API 不用改动(实际上我还是改动了,但仅仅是出于封装和事件区分处理的目的),上层应用层需要改动,需要改为按要修改的寄存器循环逐一修改。

============

用 DEMO 程序做连续写入:

寄存器地址从 6C 开始(十进制 108,为开/关灯控制的寄存器,即从开关灯寄存器开始写),线圈数选 2 个,即位写到地 109 个线圈,对应常亮/闪烁控制寄存器。

数据写 00 00 00 02(黄色部分是开关灯控制,红色部分为常亮/闪烁控制寄存器)。

寄存器定义

光色/颜色(开通通道数,开通颜色)

0 白灯。

1 红灯。

定义

应该是,开通通道数,白红为为 1-8,红为1,不能为 0

开通颜色数,为 0 或 1,

0 白,

1 红

我们目前的开关控制,用的是较早之前邓工给的设置通道数和颜色数为0,1的做法,所有对于白光就有问题了

开通通道数变为 1 了,所以白光不亮

有高中低,三种设备

不同设备,硬件所支持的开通通道数不通

支持 1 个通道的,为仅支持红色

支持 1-8 个通道的,为红色或白色

另外还有一个属性,用于控制当前设备显示什么颜色的:当前开通颜色数

红色的开通颜色数,是1,如果把仅支持红光的设备(如低光强)设置为0,则灭灯

白色的开通颜色数,是0,如果把仅支持白光的设备(如高光强)设置为1,则灭灯

低,仅支持1个通道,红色通道,开通颜色值为 1

中,有的支持只支持一个红色通道,有的支持红和白

高,仅支持1个通道,白色通道,开通颜色值为 0

如果把高光强的开通通道数改为 1,那么也灭灯

所以高光强亮灯,需要开通通道数为8,开通颜色数为 0

ch_color_for_crt 当前开通通道颜色 Opened Channel Color Now

ch_nums_for_crt 当前开通通道数量 Opened Channel Number Now

开通通道数量:1-5 白,6 红,中光强?

开灯&关灯

0-AUTO;1-手动ON;2-手动OFF

定义

手动开灯或者关灯只作为一个时间阶段的状态改变,变化一个时间阶段后可以恢复,比如LS810白天设置成手动ON,那么只维持这一个白天ON,到第二个白天还会变成AUTO,也就是正常的关灯状态(上位机写入1或者2,读出的都为0)

本质上还是修改光强寄存器,操作关灯时,当前光强寄存器变为0,不过设备内部会保存当前光强值(还不确定,一方面是保存当前值,一方面是如果到了下一个时间节点,入从白天变为和黄昏,则光强值应读取黄昏设定的光强值,可以试验一下)

如果是开灯操作,则开灯成功后,硬件会恢复其内部保存的光强值,因此要等开灯成功后,才能重新从设备读取光强。

开关灯:由通道数和光强决定,光强为0或者通道数为0,关灯。

寄存器

,”rsv95″, 108 , FMT_BCD16

注意

开/关,闪烁/常亮变化后,要从设备重新读取光强、闪烁频率等信息。

常亮&闪烁

0-AUTO;1-手动闪烁;2-手动常亮。

定义

除了值的定义不同,其它和【开灯&关灯】类似,请仔细阅读【开灯&关灯】资料。

寄存器

,”rsv96″, 109 , FMT_BCD16

注意

开/关,闪烁/常亮变化后,要从设备重新读取光强、闪烁频率等信息。

硬件底层:闪烁常亮会记录上一次的值,如果上一次数据没有,那么设置成默认值。

常亮默认值:闪烁频率20,时长3000

闪烁默认值:闪烁频率30,时长1000

如果在系统界面上,只操作常亮/闪烁开关,也会开灯,且灯也会保持对应的常亮/闪烁状态,那么,可能是由于系统采用连续写入的方式导致的问题,不是设备的问题就是数据的问题。

切换后闪烁频率联动问题

由于设备内会记忆之前的闪烁频率,因此切换常亮,会导致前一次的闪烁频率值被写回去。

高光强硬件底层的限制

常亮时的光强范围限制在20%以内,超过范围会切换至闪烁模式或者回到10%常亮模式。LM40也有这个限制。

闪烁频率

0 = 20 次/秒

1 = 30次/秒

2 = 40次/秒

3 = 60次/秒

测试下来最大开通时长和闪烁频率有关系,如果设置3秒闪一次,可以3000,如果闪的快一点,2 秒闪一次,最大是 2000,输入 3000 也会变成 2000。

时长大于闪烁周期,代表常亮

闪烁周期是3秒一次的话,时长调节到3000就是调常亮了

电压&电流

DC电流

DC电压

AC电压

读出来都是 0,这个是预留的,那个小灯没有这个功能的, 中高有的,数据要转换下的

警报

,”GPS离线报警” ,”GPS_off_line_alarm”,

如果配置了有GPS功能,产品判断到GPS故障,会置寄存器为非零,等候上位机读取 UNI_BYTE_ACCESS_UINT16

,”OPT离线报警” ,”OPT_off_line_alarm”,

如果配置了有光控功能,产品判断到光控故障(24小时持续判断),会置寄存器为非零,等候上位机读取 UNI_BYTE_ACCESS_UINT16

报警 & 故障

,”LED报警IV状态字” ,”LED_alarm_state_word”,

重要 0X0000~0X0003,低1位代表电流故障,低2位代表电压故障 UNI_BYTE_ACCESS_BCD16

,”累计亮灯时长”

小时为单位,每一小时存储一次

,”累计电能”

每一小时存储一次

,”累计数据清零–年月日时分秒” ,”rsv98″,

累计数据清零时间记录

由上位机操作 UNI_BYTE_ACCESS_BCD64

 

 

,”故障发生时间–年月日时分秒” ,”rsv99″,

灯故障发生时间记录

灯从正常变故障时自动存储 UNI_BYTE_ACCESS_BCD64

首次运行/恢复出厂设置

这次增加了一个恢复出厂设置的功能(写入除0X5A5A外的任何数据,底层灯具会自动恢复出厂设置),你们可以在工程界面上添加上去!

// 114 ,”首次运行” ,”first_run”, 127 , FMT_BCD16 , 1 , TRUE , 128 , 0x5a5a , 0x5a5a , // 首次运行 BCD16 first_run // strProperity[114]=”114,首次运行,first_run,127,FMT_BCD16,1,128,TRUE,0x5a5a,0x5a5a”; ufun_ModbusOneDataFromRamToEeprom(&(pubVar_first_run),”first_run”);

预留 UNI_BYTE_ACCESS_BCD16 modbus_first_run ; // //

#define pubVar_first_run pubVar_modbus_data.effectiv_data.modbus_first_run.data // // ufun_ModbusOneDataFromEepromToRam(&(pubVar_first_run),”first_run”);

// pubVar_first_run=0x5a5a; // //

恢复出厂设置后,灯会暂时灭掉。

1 分钟后,恢复出厂设置完成,灯恢复正常。

但是在此的一段时间内(60秒)不能对高光强设备进行读/写操作,否则会导致设备不亮,即设备会一直处于熄灭状态。

这个我用 demo 程序测试也是这样的,底层做了什么控制?

低光强无此问题

系统时间

即使设备没有添加到系统,只要场景下有任意一台设备就会自动同步 COM 下的所有设备就会被同时时间,因为我发的是广播命令

../../../../../Library/Containers/com.tencent.qq/Data/Library/Caches/Images/0339BA67D365BB54CD6EA8FFF8E3CCDF.pn

设备明细页面的系统时间改成201706282315,改了可以,但是很快后台又会同步会Windows 系统的时间到设备上,所以要改 Windows 系统的时间

其它

亮灯条件

  • 依赖的寄存器:
  • 当前光强
  • 当前开通通道颜色
  • 当前开通通道数
  • 季节区间
  • 白天、黑夜时间、光强、通道数、颜色数
  • 通道硬件接入
  • 通道有色标志字
  • 开关寄存器
  • 开通通道颜色&开通通道数量(光色)

参见前面专门的章节。

  • 时间(当前&特定时间区间的开通通道颜色、开通通道数量、光强、时长)

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.11.3

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.09.5

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.11.2

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.11.4

  • 通道硬件接入&通道有色标志字

我们前几天碰到一个灯操作后会灭掉的问题,纠结了好久,然后一个一个对比灭灯前喝灭灯后的寄存器数据,发现是

LED_通道硬件接入

LED_通道有色标志字

这两个寄存器的值,需要特殊处理,而且值必须在一定范围内,灯才会亮(这两个寄存器特殊的地方在于,和月+日,时+分,类型的寄存器一样,需要两两拆开来,不然值就不对了)

恢复出厂设置后,黑夜,写任意属性,灯就亮了

不过由于我们的编码方式不对(不知道你们原来是这样编码的),所以我们的软件一写,值不对了,灯就灭了

有恢复出厂设置功能,后面万一有问题处理会方便点的!

你们把恢复出厂值的数据读出来,以后万一碰到问题,可以对比下数据值,方便查找问题

LS810出厂设置值:

LED_通道硬件接入 0X20

LED_通道有色标志字 0X20

LM100

LED_通道硬件接入 0X20

LED_通道有色标志字 0X20

LM40

LED_通道硬件接入 0X3F

LED_通道有色标志字 0X20

LH88

LED_通道硬件接入 0XFF

LED_通道有色标志字 0X00

这些值都不需要客户设置的,如果有变动,可以恢复出厂设置

如何写设备的地址号

闭其它灯的电源,或切断COM口其它灯的数据连接,然后广播单个写设备地址。

成功率

压力测试过,COM 口通信频繁了,成功率就低了,不太频繁操作的时候,成功率高。

所以App底层驱动那里,每次操作,都会间隔1秒。

Attention

客户方(厂商)的技术人员对于有些寄存器的解释笔记模糊,而且你问他他给你的回答不一定是100%准确的,可能存在遗漏或错误!

数据结构

线圈数量

线圈数*2 即为字节数,一个线圈=2字节byte

设备属性的定义有 StartAddress(此属性的寄存器的线圈开始地址) 和 CoilNum,则属性的EndAddress,通过 StartAddress + 线圈数 即可得到

字→16位开关量

寄存器多个值数据组合

另外测试过程发现,有写寄存器的数据,是两个 byte 存了两个数据项的,比如春季黎明时分,其数据是要把 2 个 byte 分别单独拆开,对应一个是小时,一个是分钟

/Users/laurel/Desktop/38366CCC-26C0-4AAF-9DDB-237912CFD37D.png

还有比如警报状态也是,这些类似这样的 月加日、时加分的外,

还有其它哪些是采用组合数据方式的寄存器?

比如:

春季月日

0320

秋季月日

0923

进制转换

还有就是

有的寄存器,读出来的是 10 进制的数据,比如光强 10 进制,没问题。

但是有的,读出来的是 16 进制的,需要做进制转换后才能正常显示,比如系统时间

需要做进制转换后才正常显示

转成 16 进制存储的,占用空间更小

16 转 10 (Convert.ToInt32,结果都是 10 进制,知识第二个参数,表示传入参数(第一个参数)的进制数)

Convert.ToInt32(“a”, 16) -> 10

10 转 16(16 进制 .NET 只能用 string 表示)

Convert.ToString(10, 16); -> a

Convert.ToString(35283258316578, 16) -> 201706141722

 

系统时间最特殊,不一样-

需要把读出来的值,转 进制

35283258316578 -》 201706141722

接口

连续写入

最大读取&写入线圈/字节数

// 南华的 DEMO 程序,是 120 线圈
// 我测试下来,读取可以 126 个线圈,超过就超时了,写入可以 125 个线圈,要注意不要写入“首次运行”属性,因为这个属性是控制出厂设置用的。

protected int maxReadCoilCount = 126;//126;

/// <summary>
/// 这里有个大坑,恢复出厂设置后,可写线圈数就变成了 120,如果超过 120,则会写入超时,但是平常状态下是无此问题的
/// </summary>
protected int maxWriteCoilCount = 120;//125;

广播连续写入

广播不但可以写入单个,也可连续写入。

设定启始写入的项目(00 07 表示在组项之后的寄存器),这样不会覆盖设备的组号和项号寄存器。

../../../../../Library/Containers/com.tencent.qq/Data/Library/Caches/Images/A4B149C932AB63BFCA1D09BB9A363B96.pn

定向广播连续写入(群组/组号/项号批量控制)

恢复出厂设置

请参见寄存器定义节的相关内容。

先读取设备的组&项号

批量控制/Screen%20Shot%202017-05-05%20at%204.24.30%20PM.png

用 demo 程序,发群组批量控制

项目要从组号的地址开始(00 05),切勿从 00 00 开始,那样会把所有灯的所有数据包括设备地址都改了,会导致设备连接不上及通讯异常

定向广播示例:

示例数据

组&项

03 分组,光强 100

00 03 00 03 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 03 01 06 01 09 01 12 01 00 00 20 17 05 05 16 25 00 10

00 00 00 00 00 96 00 01 00 00 00 2C 00 3C 00 A0 00 78 00 FF 00 3C 00 A0

00 0A 00 50 00 32 00 00 00 00 00 00 00 00 00 01 00 EE 00 02 00 00 00 00

00 00 00 00 00 00 00 EE 00 00 00 00 00 00 00 00 00 00 00 00 00 96 00 64

00 02 00 00 00 00 00 96 00 64 00 02 00 00 00 05 00 96 00 64 00 02 00 01

00 01 02 EE 00 64 00 02 00 00 00 20 00 20 00 00 00 00 00 EE 00 81 00 FF

00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 01 00 01 02 EE 00 64

00 02 00 63 00 00 00 00

项号 FF FF 传空值,表示没有值,即只要是组号相同,就符合条件

00 01 FF FF 00 00 00 00 00 00 00 00 00 07 00 00 00 00 00 00 00 00 00 00

00 00 00 00 00 00 03 01 06 01 09 01 12 01 00 00 20 17 05 05 16 25 00 10

00 00 00 00 00 96 00 01 00 00 00 2C 00 3C 00 A0 00 78 00 FF 00 3C 00 A0

00 0A 00 50 00 32 00 00 00 00 00 00 00 00 00 01 00 EE 00 02 00 00 00 00

00 00 00 00 00 00 00 EE 00 00 00 00 00 00 00 00 00 00 00 00 00 96 00 64

00 02 00 00 00 00 00 96 00 64 00 02 00 00 00 05 00 96 00 64 00 02 00 01

00 01 02 EE 00 64 00 02 00 00 00 20 00 20 00 00 00 00 00 EE 00 81 00 FF

00 00 00 00 00 00 00 00 20 00 00 00 00 00 00 00 00 01 00 01 02 EE 00 64

00 02 00 63 00 00 00 00

备注

新版定向广播写入,modbus 底层通信api一致,只是设备处理的方式不一致了,

设备只更新写入输入的最后一个寄存器的值了,因此底层 API 不用改动(实际上我还是改动了,但仅仅是出于封装和事件区分处理的目的),上层应用层需要改动,需要改为按要修改的寄存器循环逐一修改。

============

用 DEMO 程序做连续写入:

寄存器地址从 6C 开始(十进制 108,为开/关灯控制的寄存器,即从开关灯寄存器开始写),线圈数选 2 个,即位写到地 109 个线圈,对应常亮/闪烁控制寄存器。

数据写 00 00 00 02(黄色部分是开关灯控制,红色部分为常亮/闪烁控制寄存器)。

寄存器定义

光色/颜色(开通通道数,开通颜色)

0 白灯。

1 红灯。

定义

应该是,开通通道数,白红为为 1-8,红为1,不能为 0

开通颜色数,为 0 或 1,

0 白,

1 红

我们目前的开关控制,用的是较早之前邓工给的设置通道数和颜色数为0,1的做法,所有对于白光就有问题了

开通通道数变为 1 了,所以白光不亮

有高中低,三种设备

不同设备,硬件所支持的开通通道数不通

支持 1 个通道的,为仅支持红色

支持 1-8 个通道的,为红色或白色

另外还有一个属性,用于控制当前设备显示什么颜色的:当前开通颜色数

红色的开通颜色数,是1,如果把仅支持红光的设备(如低光强)设置为0,则灭灯

白色的开通颜色数,是0,如果把仅支持白光的设备(如高光强)设置为1,则灭灯

低,仅支持1个通道,红色通道,开通颜色值为 1

中,有的支持只支持一个红色通道,有的支持红和白

高,仅支持1个通道,白色通道,开通颜色值为 0

如果把高光强的开通通道数改为 1,那么也灭灯

所以高光强亮灯,需要开通通道数为8,开通颜色数为 0

ch_color_for_crt 当前开通通道颜色 Opened Channel Color Now

ch_nums_for_crt 当前开通通道数量 Opened Channel Number Now

开通通道数量:1-5 白,6 红,中光强?

开灯&关灯

0-AUTO;1-手动ON;2-手动OFF

定义

手动开灯或者关灯只作为一个时间阶段的状态改变,变化一个时间阶段后可以恢复,比如LS810白天设置成手动ON,那么只维持这一个白天ON,到第二个白天还会变成AUTO,也就是正常的关灯状态(上位机写入1或者2,读出的都为0)

本质上还是修改光强寄存器,操作关灯时,当前光强寄存器变为0,不过设备内部会保存当前光强值(还不确定,一方面是保存当前值,一方面是如果到了下一个时间节点,入从白天变为和黄昏,则光强值应读取黄昏设定的光强值,可以试验一下)

如果是开灯操作,则开灯成功后,硬件会恢复其内部保存的光强值,因此要等开灯成功后,才能重新从设备读取光强。

开关灯:由通道数和光强决定,光强为0或者通道数为0,关灯。

寄存器

,”rsv95″, 108 , FMT_BCD16

注意

开/关,闪烁/常亮变化后,要从设备重新读取光强、闪烁频率等信息。

常亮&闪烁

0-AUTO;1-手动闪烁;2-手动常亮。

定义

除了值的定义不同,其它和【开灯&关灯】类似,请仔细阅读【开灯&关灯】资料。

寄存器

,”rsv96″, 109 , FMT_BCD16

注意

开/关,闪烁/常亮变化后,要从设备重新读取光强、闪烁频率等信息。

硬件底层:闪烁常亮会记录上一次的值,如果上一次数据没有,那么设置成默认值。

常亮默认值:闪烁频率20,时长3000

闪烁默认值:闪烁频率30,时长1000

如果在系统界面上,只操作常亮/闪烁开关,也会开灯,且灯也会保持对应的常亮/闪烁状态,那么,可能是由于系统采用连续写入的方式导致的问题,不是设备的问题就是数据的问题。

切换后闪烁频率联动问题

由于设备内会记忆之前的闪烁频率,因此切换常亮,会导致前一次的闪烁频率值被写回去。

高光强硬件底层的限制

常亮时的光强范围限制在20%以内,超过范围会切换至闪烁模式或者回到10%常亮模式。LM40也有这个限制。

闪烁频率

0 = 20 次/秒

1 = 30次/秒

2 = 40次/秒

3 = 60次/秒

测试下来最大开通时长和闪烁频率有关系,如果设置3秒闪一次,可以3000,如果闪的快一点,2 秒闪一次,最大是 2000,输入 3000 也会变成 2000。

时长大于闪烁周期,代表常亮

闪烁周期是3秒一次的话,时长调节到3000就是调常亮了

电压&电流

DC电流

DC电压

AC电压

读出来都是 0,这个是预留的,那个小灯没有这个功能的, 中高有的,数据要转换下的

警报

,”GPS离线报警” ,”GPS_off_line_alarm”,

如果配置了有GPS功能,产品判断到GPS故障,会置寄存器为非零,等候上位机读取 UNI_BYTE_ACCESS_UINT16

,”OPT离线报警” ,”OPT_off_line_alarm”,

如果配置了有光控功能,产品判断到光控故障(24小时持续判断),会置寄存器为非零,等候上位机读取 UNI_BYTE_ACCESS_UINT16

报警 & 故障

,”LED报警IV状态字” ,”LED_alarm_state_word”,

重要 0X0000~0X0003,低1位代表电流故障,低2位代表电压故障 UNI_BYTE_ACCESS_BCD16

,”累计亮灯时长”

小时为单位,每一小时存储一次

,”累计电能”

每一小时存储一次

,”累计数据清零–年月日时分秒” ,”rsv98″,

累计数据清零时间记录

由上位机操作 UNI_BYTE_ACCESS_BCD64

 

 

,”故障发生时间–年月日时分秒” ,”rsv99″,

灯故障发生时间记录

灯从正常变故障时自动存储 UNI_BYTE_ACCESS_BCD64

首次运行/恢复出厂设置

这次增加了一个恢复出厂设置的功能(写入除0X5A5A外的任何数据,底层灯具会自动恢复出厂设置),你们可以在工程界面上添加上去!

// 114 ,”首次运行” ,”first_run”, 127 , FMT_BCD16 , 1 , TRUE , 128 , 0x5a5a , 0x5a5a , // 首次运行 BCD16 first_run // strProperity[114]=”114,首次运行,first_run,127,FMT_BCD16,1,128,TRUE,0x5a5a,0x5a5a”; ufun_ModbusOneDataFromRamToEeprom(&(pubVar_first_run),”first_run”);

预留 UNI_BYTE_ACCESS_BCD16 modbus_first_run ; // //

#define pubVar_first_run pubVar_modbus_data.effectiv_data.modbus_first_run.data // // ufun_ModbusOneDataFromEepromToRam(&(pubVar_first_run),”first_run”);

// pubVar_first_run=0x5a5a; // //

恢复出厂设置后,灯会暂时灭掉。

1 分钟后,恢复出厂设置完成,灯恢复正常。

但是在此的一段时间内(60秒)不能对高光强设备进行读/写操作,否则会导致设备不亮,即设备会一直处于熄灭状态。

这个我用 demo 程序测试也是这样的,底层做了什么控制?

低光强无此问题

系统时间

即使设备没有添加到系统,只要场景下有任意一台设备就会自动同步 COM 下的所有设备就会被同时时间,因为我发的是广播命令

../../../../../Library/Containers/com.tencent.qq/Data/Library/Caches/Images/0339BA67D365BB54CD6EA8FFF8E3CCDF.pn

设备明细页面的系统时间改成201706282315,改了可以,但是很快后台又会同步会Windows 系统的时间到设备上,所以要改 Windows 系统的时间

其它

亮灯条件

  • 依赖的寄存器:
  • 当前光强
  • 当前开通通道颜色
  • 当前开通通道数
  • 季节区间
  • 白天、黑夜时间、光强、通道数、颜色数
  • 通道硬件接入
  • 通道有色标志字
  • 开关寄存器
  • 开通通道颜色&开通通道数量(光色)

参见前面专门的章节。

  • 时间(当前&特定时间区间的开通通道颜色、开通通道数量、光强、时长)

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.11.3

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.09.5

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.11.2

../../../../../Desktop/屏幕快照%202017-07-18%20上午11.11.4

  • 通道硬件接入&通道有色标志字

我们前几天碰到一个灯操作后会灭掉的问题,纠结了好久,然后一个一个对比灭灯前喝灭灯后的寄存器数据,发现是

LED_通道硬件接入

LED_通道有色标志字

这两个寄存器的值,需要特殊处理,而且值必须在一定范围内,灯才会亮(这两个寄存器特殊的地方在于,和月+日,时+分,类型的寄存器一样,需要两两拆开来,不然值就不对了)

恢复出厂设置后,黑夜,写任意属性,灯就亮了

不过由于我们的编码方式不对(不知道你们原来是这样编码的),所以我们的软件一写,值不对了,灯就灭了

有恢复出厂设置功能,后面万一有问题处理会方便点的!

你们把恢复出厂值的数据读出来,以后万一碰到问题,可以对比下数据值,方便查找问题

LS810出厂设置值:

LED_通道硬件接入 0X20

LED_通道有色标志字 0X20

LM100

LED_通道硬件接入 0X20

LED_通道有色标志字 0X20

LM40

LED_通道硬件接入 0X3F

LED_通道有色标志字 0X20

LH88

LED_通道硬件接入 0XFF

LED_通道有色标志字 0X00

这些值都不需要客户设置的,如果有变动,可以恢复出厂设置

如何写设备的地址号

闭其它灯的电源,或切断COM口其它灯的数据连接,然后广播单个写设备地址。

成功率

压力测试过,COM 口通信频繁了,成功率就低了,不太频繁操作的时候,成功率高。

所以App底层驱动那里,每次操作,都会间隔1秒。

发表评论

电子邮件地址不会被公开。