读书人

求教一个也是是数据结构也许是算法的有

发布时间: 2012-04-12 15:46:35 作者: rapoo

求教一个也是是数据结构也许是算法的问题
事情是这个样子滴:
一个有72个指示灯+56个继电器组成的指示面板,一台下位机,一个上位机软件
要实现的功能是:
56个继电器,每8个表示一个BYTE数据,一共7个数据(数组S表示)。72个指示灯,每8个表示一个BYTE数据,一共9个(数组R)。
开机加电后下位机将继电器的状态(数组R)发送给上位机。当某一个继电器吸合时候,R[i]中对应的BIT位置1,否则置0。然后下位机将数组R发送到上位机,上位机读取数组R,然后根据继电器的情况,表示出72个指示灯的亮、灭(1或0),存入数组S,然后下发,下位机读取到数组S后,根据数组元素中各个BIT位的情况(1或0),控制面板指示灯的亮、灭。

问题求解:
怎么实现56个继电器开关组合表示出72个灯的亮灭状态?
我不是计算机专业的,没学过数据结构神马的,想了半天也没想出来。
麻烦朋友们帮忙解答一下,如果需要什么相关的知识点,请提点一下,我去翻书。


还有个问题,上述上位机软件,我想实现另一个功能:
用excel表格存储不同机型的继电器组合状态,然后上位机读取这个excel文件,表示72个指示灯的亮灭。
也就是假设继电器的状态一直不变,但当读取的excel文件为A时,指示灯亮前10个;当读取excel文件为B时,指示灯亮最后10个。这个应该没什么问题,应该就是解决了上面的56继电器对应72灯就行。
我想问的是关于excel的问题,用CreateOleObject('Excel.Application');创建了excel对象,但是如果电脑上没有安装excel,上位机软件就不能正常运行。想要实现不需要安装excel,上位机软件也能读取excel文件的内容。不知道用Delphi7内置的excel控件能不能实现不安装excel也能读取文件的功能?或者还是必须用ADO连接?
我用excel控件时候,创建了ExcelApplication、ExcelWorkSheet、ExcelWorkBook对象,当用ExcelApp.WorkSheets[1].Activate激活excel的第一页时,总是报错Activate未定义,但是直接用CreateOleObject()创建excel对象时候就没问题,请问这是怎么回事?

谢谢了!!!

[解决办法]
楼主留个邮箱吧。
Excel的部分刚给别人写了例子,也许用的上。

其他部分再看,好长的要求
[解决办法]
这种问题为何不用XML,而用EXCEL?
[解决办法]
继电器如果只有开、关2种状态
56个继电器是无法一次表示72个灯的亮灭的,2^56<2^72

除非72个灯里,同时亮的只有1个,则2^56>72,可以表达
[解决办法]
感觉你的问题是数据逻辑的问题,上学时好像见过类似的问题,
可以这样

a,b,c,d,e,f,g,h
.
.
.
a72,b72,c72,d72,e72,f72,g72,h72

每一行代表一盏灯,每一位代表一个继电器状态,经过矩阵计算可以得到一个方程式,就是各继电器与各灯之间的逻辑关系,据此可以设计出逻辑电路。

具体运算忘了,只记得当时是十字路口信号灯的那么一个例子。你可以找找有关数字逻辑的教材看看
[解决办法]
听我细细道来

DWORD数值有木有 32个位

0000 0000 0000 0000 0000 是吧

定义2个DWORD数值 a, b

a表示 1-32号灯的状态
b表示 33-56号灯的状态 取哪24位自己决定

然后用a, b来表示72个状态还不是简单的事, 比如说

a 1000 0000 0000 0000 0000
b 0000 0000 0000 0000 0000 状态1

a 1000 0000 0000 0000 0000
b 1000 0000 0000 0000 0000 状态2

a 1000 0000 0000 0000 0000
b 1100 0000 0000 0000 0000 状态3

这样应该没错哈 这样表示下去何止72种.

另外提供取位和设置位状态的函数

Delphi(Pascal) code
{*-------------------------------------------获取位状态@param       dw1      操作数@param       Pos      位置  从第0位开始   31,30,29..0;@return      位状态-------------------------------------------*}function GetBitSate(dw1:DWORD; Pos:Byte):Byte;begin  Result:=((dw1 and (1 shl Pos))shr Pos);end;{*-------------------------------------------设置位状态@param       dw1      操作数@param       Pos      位置  从第0位开始   31,30,29..0;@param       Sate     状态 0 或 1@return     设置完成后的操作数  实际操作时注意取这个数为结果-------------------------------------------*}function SetBitSate(dw1:DWORD; Pos:Byte; Sate: Byte): DWORD;var  dw2: DWORD;begin  dw2 := dw1;  Result := dw2;  if GetBitSate(dw1,Pos) = Sate then Exit;  case Sate of    0: Result := dw2 and (not (1 shl Pos));    1: Result := dw2 or (1 shl Pos);  end;end; 

读书人网 >.NET

热点推荐