BiSS 你越按标准做,越死在客户的魔改上

首发于公众号「如是有为」 · 查看原文

BiSS 你越按标准做,越死在客户的魔改上

按标准做出来,现场反而不能用

你以为接的是 BiSS

客户要的却是一套祖传私货

BiSS 你越按标准做,越死在客户的魔改上

最让人窝火的,不是协议难。

最让人窝火的是,你按标准把主站做出来了,线接对了,时钟打出来了,逻辑分析仪上波形也规规矩矩,结果客户看一眼,来一句:“不对,我们以前那家能用。”

这句话最损的地方,不是难听,是会装。装得像你不懂 BiSS,像你主站没做完,像你把标准理解偏了。可真把现场那串数据一位一位扒开,十有八九不是你不会做,是对方嘴里喊的是 BiSS,手里跑的却是一套 BiSS 外壳 + 私有位定义 + 老设备脾气 的拼装货。

BiSS 官方定义其实很清楚:点对点场景下,主站通过 MA 发时钟,从站通过 SLO 回数据,帧有固定的头部、数据段、停止和超时;它在硬件接法上兼容 SSI 的思路,但协议能力比 SSI 多,带 CRC、寄存器访问和扩展诊断。

这事真正拧巴的地方就在这儿:你越按标准做,越可能接不上他们那套“以前能跑”的东西。

一、看着像标准,拆开全是私活

先把标准骨架按死,不给人装神弄鬼的空间。

BiSS C 的一帧,长相并不玄。空闲时主从保持高电平,主站开始发时钟后,从站进入一帧响应,帧里先是头部,再是数据段,最后停止和超时,然后回到空闲。官方中文协议图把这些阶段直接画成了 IDLE、HEADER、DATA CHANNELS、TIMEOUT,头部里还能看到 LAT、ACK、STR、CDS 这些位。

1.空闲

2.主站发时钟

3.从站回应头部位

4.送出数据位

5.送出状态/CRC

6.停止/超时

7.回到空闲

问题来了。标准只规定“这一帧怎么回来”,不替每家设备把“这一帧里每一位都代表什么”全钉死。公开的 BiSS 标准编码器 EDS 文档直接写了,单周期数据常见顺序是:位置值(多圈、单圈)、error、warning、进一步诊断位和 CRC。

麻烦就出在“常见顺序”这四个字。很多客户一张嘴就是:“我们这个是标准 BiSS。”真抓一帧回来,你会看到这种东西:

标准味比较足的拆法:[MT11:0][ST16:0][E][W][D1:D0][CRC5:0]

客户现场那套“也是 BiSS”的拆法:[ST16:0][MT11:0][W][E][保留2位][CRC5:0]

你看着都叫 BiSS。主站也都能把位收回来。可你按第一种去拆第二种,位置值马上乱飞。

最典型的现场现象就是:高位跳、整圈数翻倍、报警位和实际状态对不上、CRC 还偶尔碰巧能过。

这时候对面还会特别从容地问你:“这不就是 BiSS 吗,你怎么读不对?”

这时候该回的就一句:骨架像 BiSS,不等于你肚子里那点私货也配叫标准。

二、波形全对,数值全错,最折磨人的坑就长这样

这个坑最阴,因为它特别像“你自己水平不够”。

现场一开始通常都很顺。MA 有、SLO 有、422 差分正常、频率也在设备宣称范围内。从形状上看,它和 SSI/BiSS 那种“主站打时钟、从站吐数据”的路数几乎一个模子。BiSS 官方文档本来就承认,点对点配置下它与 SSI 在硬件上兼容。

假设客户给你的口头信息只有一句:“24位位置值,带CRC,BiSS接口。”你按最朴素的标准思路写主站,心里想的通常是:[Position23:0][E][W][CRC5:0]

抓回来一帧原始位串,长这样:0011 0101 0110 1010 1110 0011 1 1 010101。你按公开 profile 的思路去拆,结果位置就是不对。转一圈不线性,跨零点时还会蹦,高位像喝多了一样乱跳。

后来一问才知道,对方真实定义可能是:[ST16:0][MT6:0][温漂补偿位][报警位][CRC5:0]。注意,波形上你根本看不出这层区别。你收回来的是同一串 0 和 1,错的是解释规则。

这类坑最恶心的地方就在这儿:你不是没收到数据,你是收到了,但对方压根没把“这串数据到底什么意思”说人话。

然后客户还会轻飘飘补一句:“以前那家直接就能用。”这话一出来,现场空气都脏了。以前那家能用,不代表这是标准。更大的可能是,以前那家只是把你这套说不清的祖传位定义,也跟着一块抄了。

三、最脏的改法,不是改时序,是偷偷改 CRC

真要论损,很多私改根本不动大框架,它专门挑最容易埋雷、最不容易一眼看出来的地方下手:CRC。

按标准做主站,常规流程通常是这样:

1.取位置位 + E/W/诊断位

2.按标准覆盖范围计算 CRC

3.将接收的 CRC 按规则反相

4.比对是否一致

可很多现场设备偏偏就在这里做手脚。给你一个特别像中国现场的例子:

公开资料版本:Position 24 bit,E 1 bit,W 1 bit,CRC 6 bit;CRC覆盖范围:Position + E + W;CRC位反相发送

客户现场版本:Position 24 bit,E 1 bit,W 1 bit,CRC 6 bit;CRC只覆盖Position;E/W不参与CRC;CRC位不反相;起始值改成全1

然后客户会很平静地告诉你:“我们这也是标准 BiSS。”做私有可以,谁也没拦着。但你别一边私改,一边还把“标准”俩字挂脑门上。这就像把锁芯换了、钥匙齿形也改了,回头还说“我这门是标准门,你打不开是你手艺差”。这不是技术,这是耍赖。

说白了,很多所谓“现场标准”,其实就是:公开协议的壳 + 自定义校验 + 历史项目遗留。

BiSS 你越按标准做,越死在客户的魔改上

四、寄存器访问本来是标准能力,硬是被玩成了私有门槛

BiSS 比 SSI 值钱,不只是因为它会吐位置值,更因为它支持寄存器访问。这本来是好事,说明标准不是一根死数据管,它是能识别设备、能读参数、能做配置的。可一到现场,这块就最容易被玩成私有暗门。

主站初始化流程,按公开建议写得规规矩矩:上电 → 发起寄存器读 → 读取 0x7B–0x7D 识别 Device ID → 读取 0x7E–0x7F 识别 Manufacturer ID → 根据型号切换位宽和解析规则。结果接到客户那只“也是 BiSS”的编码器上,读出来全是鬼话。

后来一查,才发现它那边是这么玩的:0x7B–0x7D 不是 Device ID,是固件内部版本号;0x7E–0x7F 不是 Manufacturer ID,是项目编号;真正设备型号藏在另外一段私有地址;进入寄存器访问前,还要先走一轮厂家自定义唤醒序列。

最烦的不是他特殊,最烦的是他特殊完了还要装标准。你要私有,就老老实实说私有。别搞得跟别人接不上,是别人水平差一样。

五、客户嘴里的“兼容”,很多时候不是兼容标准,是兼容旧垃圾

这类项目最憋屈,因为它一开始就没说人话。客户说“你这个主站要兼容我们现场编码器”,真落地时,真实意思经常是:

1.时钟频率要按旧驱动器残留参数跑

2.起始前要多等两拍

3.error/warning逻辑要再翻一次

4.单圈多圈顺序不能按公开profile来

5.CRC规则不能完全照文档

6.读寄存器前先发一轮厂家握手

你说这算不算“能跑”?能跑。你说这算不算“标准兼容”?那就别往自己脸上贴金了。很多项目压根不是奔着“最大互通性”去的,他们奔着的是:我这套老东西已经活着,别给我整死。于是“兼容”这两个字,到最后经常就变成了:请你别按标准做,请你按我这堆历史遗留做。

六、最恶心的不是私改,是私改完了还装标准

私改不是原罪。恶心的是另一种人:东西明明改了,位定义改了,CRC 改了,寄存器也改了,嘴上还死咬着 “我们这是标准 BiSS”。

你要私有,就明说私有。你要兼容旧设备,就明说兼容旧设备。别一边吃标准的名声,一边干私改的活,最后别人按标准接不上,还反过来怪别人不懂协议。说穿了,不是标准难接,是有人拿一套祖传脾气冒充标准,还真把自己装出权威来了。

BiSS 你越按标准做,越死在客户的魔改上

七、这 8 样东西拿不出来,就别跟我谈“标准兼容”

真想判断客户嘴里的到底是不是“标准 BiSS”,别听他喊,直接让他把下面这 8 样东西拿出来:

1.单周期数据帧图

2.每个位段定义表

3.CRC位数、起始值、多项式、覆盖范围、是否反相

4.error/warning逻辑极性

5.多圈/单圈顺序

6.寄存器地图

7.读写时序图

8.上电初始化和异常恢复流程

拿得出来,才叫做事。拿不出来,还满嘴“标准 BiSS”,那不叫协议说明,那叫拿包装纸当说明书。现场最离谱的,从来不是协议做不出来。是你把标准做对了,别人却拿一套说不清、写不明、只靠老项目传下来的私改东西告诉你:“这才是标准。”

这行最荒唐的地方也就在这儿。不是没人会做标准,是总有人把一堆私货洗洗脸,就真以为那张脸配叫标准。

应作如是观
公众号「如是有为」二维码

关注公众号「如是有为」

微信扫一扫,新文章先在公众号发出。