以前采用SPCOM进行数据发送和接收,问题不大,但现在的项目遇到一个问题,不知道该怎么解决,请各位Delphi的XDJM予以指点。
问题如下:
计算机向控制器发送数据包:ff 00 01 00 00 00 00 00 00 00 00 00 00 00 00 00 
控制器接收到上述数据包后返回n条数据:
例:
FF 08 01 01 03 00 00 01 01 06 06 1A 09 14 01 AD 
FF 08 01 02 03 00 00 01 01 06 06 1A 09 14 01 AC 
FF 08 01 03 03 00 00 01 01 06 06 1A 09 14 01 AB 
FF 08 01 04 03 00 00 01 01 06 06 1A 09 14 01 AA 
FF 08 01 05 03 00 00 01 01 06 06 1A 09 14 01 A9 
FF 08 01 06 03 00 00 01 01 06 06 1A 09 14 01 A8 
FF 08 01 07 03 00 00 01 01 06 06 1A 09 14 01 A7 
FF 08 01 08 03 00 00 01 01 06 06 1A 09 14 01 A6 SPCOM接收完上述数据后再重复发送数据包,形成循检功能。
现在的问题是:
1、采用SPCOM/mscomm重复发送数据包时如何判断数据是否接收完毕?(n=接收数据包的第二个字节值,如上述情况n=8),如何延时?
2、接收到的数据如何临时存储并读取进行二次转换,要求将接收到的数据帧转换成常规的数据段:如总个数 地址1 地址2 状态 等等?
   说明:我当时采用了*.log文件形式缓存接收到的字符串,并用另一个TTimer控件定时读取log文件的行信息,进行分解转换,但总出现异常,或报告不能为read或write,每查找到原因;后来改用TMemo控件缓存和读取数据,但在窗体变化或者meme滚动条认为变更时出现数据丢失,或者读取数据失败?
3、针对大批量数据查询和曲线分析,如何处理能够更简洁?可否提供实例?
4、当天的通讯数据保存到数据库好还是txt文本文档形式?一天的通讯记录有120万条左右,而且,要求24小时开机监控,至少不断电持续时间为6-7天时间。
个人邮箱:[email protected]
上述问题还请各位Delphi的XDJM不吝赐教一二!分不够,可开贴另加!

解决方案 »

  1.   

    没有通讯协议吗?
    像你这种情况就应当要存在通讯协议.
    哪怕增加一个握手也好:
    上位机: ACK
    下位机回:ACK
    一位机:ff 00 01
    下位机:
    FF 08 01 01 03 00 00 01 01 06 06 1A 09 14 01 AD 
    FF 08 01 02 03 00 00 01 01 06 06 1A 09 14 01 AC 
    FF 08 01 03 03 00 00 01 01 06 06 1A 09 14 01 AB 
    FF 08 01 04 03 00 00 01 01 06 06 1A 09 14 01 AA 
    FF 08 01 05 03 00 00 01 01 06 06 1A 09 14 01 A9 
    FF 08 01 06 03 00 00 01 01 06 06 1A 09 14 01 A8 
    FF 08 01 07 03 00 00 01 01 06 06 1A 09 14 01 A7 
    FF 08 01 08 03 00 00 01 01 06 06 1A 09 14 01 A6 
    EOF ACK
    上位机:ACK
    下位机:ACK
    上位机:......
      

  2.   

    to dinglinger:
    1、控制设备大概要10台左右,每个设备下带60多个点,点数可能不定;
    2、上位机发送的数据是循环变化的:
    当第一台控制器的数据接收完毕后,则发送:FF 00 02 00....
    然后直到发送:FF 00 N 00 ....
    直到一个大循环结束后再回复到FF 00 01 00...
      

  3.   

    针对N台控制设备可以这样处理:
      1.在启动时,加载设备信息;(设备信息可以保存在数据库中);Device:array[0..N] of Tdevice;
      2.用定时器对设备队列进行轮循;设备信息队列原理基本可以这样老滤:
      type
        TDevice=record
           DeviceId:byte;//---保存设备的地址码,也用做设备ID号;
           DeviceReceviceData:tstringlist;//---保存接收据的数据;
        end;
    var
      Header:byte=0;//---这个就是指向设备队列的指针,从第一个设备开始;
    处理数据的相关过程自己可以定义了....
      
                    
      

  4.   

    写一个动态写库程序就可以了,用数据库最好的,当采集与数据都在一台机上时,感觉oracle比较好用,如果不在一台机,用MsSql更简单些,Ado就够用了.用数据共享的方式不会出现你讲的不能为read或write.我认为要做一个配置程序来设定一些参数,把不确定的因素用人工维护来消除.看看我的 http://211.138.141.132/scss
      

  5.   

    这些问题和数据库有什么关系?
    自己设计record,根据地址把采集值区分.把数据存放在file of record这样的文件里.或者使用FileStream.只要你程序写的够安全,6.7天小意思.但是记得要定期保存数据,减少数据丢失的可能.
    查询,曲线,数据全部都从file of record里读出..速度很快,我重绘一条30天的曲线,也在1秒以内,我用teechart.
    串口的那个问题,建议你参考一下cnpack里的cnrs232的代码.
      

  6.   

    建立一个超时控制机制就可以了,如上所说,定义一个record,或者使用twidestring接收数据都可以,循环检测处理,等一个点处理完后,进行下一个的轮循