我发现使用rmodbus库读取64个连续内存位置(元素)是通过Modbus检索信息最有效的方式。
我的目标是将读取的信息记录在一个简单的数据库中,可以通过数据挖掘在网页上生成图表和数据表,并将最新值存储在实例变量中。
rmodbus库将数据读入一个数组中,其中每个元素的索引表示该元素的地址。然而,我想将索引转换为八进制,因为这与用户已经熟悉的元素寻址方案相对应,并且更容易在界面中引用。
编辑添加详细信息和细化:此时,我正在使用以下模式:
create_table "elements", :force => true do |t|
t.string "name"
t.integer "modbus_connection_id"
t.string "address"
t.string "eng_unit"
t.integer "base"
t.string "wiring"
t.text "note"
t.boolean "log"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "events", :force => true do |t|
t.integer "element_id"
t.string "value"
t.datetime "created_at"
t.datetime "updated_at"
end
create_table "modbus_connections", :force => true do |t|
t.string "name"
t.string "ip_address"
t.integer "port"
t.integer "client"
t.text "note"
t.datetime "created_at"
t.datetime "updated_at"
end
这个想法是,一个后台进程将可能会对modbus进行轮询并与自身进行比较,以便记录只有在被请求记录的情况下才发生变化的元素。元素应该存储在数据库和变量中,已经缩放,因此前端不必担心它。那些没有记录的元素仍然保存在实例变量中,用于半实时的提示显示类型监视。然后,在UI请求时,将解析其事件表中的记录元素以进行图形和表格。
第一个问题:(最后!)是否更合理地将数据保留在数组中,并应用一个处理程序来转换索引(以及恰好相应的元素值,我使用`v.collect {|i| i.to_s(16)}`进行转换),还是更好地将所有数据转移到哈希中,其中索引和值可以在最可用的形式下幸福地生活?
第一个问题编辑:鉴于我的问题趋向于仅记录更改的数据到简单的sqlite数据库,并且我需要跟踪元素的更改以确定哪些在modbus读取之间发生了更改,数组或哈希是否更有效地进行比较?我应该关心吗?
第二个问题:在Rails中,假设每分钟记录一次,大约一千个数据点是否更好地保留在独立字段中,还是应该将它们留在64个元素块中,并在传递给接口时解析信息?
第二个问题编辑:将大量未更改的数据运行到数据库的一个分钟“行”中似乎很平淡。此外,它不允许轻松动态选择要记录的元素。似乎将“记录器”事件基于事件而不是基于时间间隔更为适合。这意味着第一个问题在这里更为重要,因为它很可能会成为状态检查机制。
我猜我对这个启示进行了不必要的重新发明,因为这很像现有的“记录器”。阅读关于SO的内容揭示了一个古老的问题,即将日志记录到DB vs. FS。由于日志本身是应用程序的基础,我倾向于记录到DB,最可能是sqlite,考虑到我所读到的内容。
第二个问题再次编辑:现在是归一化的问题,我所读到的所有内容都表明,“可扩展性”往往需要非归一化。我的记录“Events”表将相对简单,包括时间戳、值和元素ID。它是否还应该将来自Elements表内部的最常见属性进行非归一化,或者在这个相对较小的规模上进行联接?
有人有任何喜欢的Ruby记录框架/ gem / bundle /插件/任何东西吗?