Показать сообщение отдельно
Старый 29.06.2012, 17:31   #1
AlexSE
Новичок
 
Регистрация: Jun 2012
Сообщения: 20
Благодарил(а): 0 раз(а)
Поблагодарили: 0 раз(а) в 0 сообщениях
По умолчанию Срочно! Помогите! О разделяемой памяти!

Всем добрый день!
Нужна помощь, может быть кто-нибудь у же сталкивался с проблемой вывода данных!
Apache установлен на контроллере.
Пробовал двумя способами:

1 способ:
Через функцию shmop взаимодействовать с памятью.
Взял адреса из файла load_files.srv. Он туда их автоматом прописывает.
<?php
// отрытие
$shm_id = shmop_open(0xa0a8h, "c", 0644, 100);

if(!$shm_id)
{
echo "Ошибка при открытии.\n";
}

// Получаем размер сегмента разделяемой памяти
$shm_size = shmop_size($shm_id);
// Считываем
$my_data = shmop_read($shm_id, 0, $shm_size);
if(!$my_string)
{
echo "Ошибка при попытке чтения разделяемой памяти\n";
}
echo " ".$my_data."\n";
//закрываем
shmop_close($shm_id);
?>

как бы работает- но выводит пустоту
Тогда я решил поэкспериментировать и взял адрес из переменных modbus
- вообще не работает(в плане того, что даже просто текст не выводит).

2 способ:
Мне предложили чтобы прога на С записывала в файл , а потом уже от туда читать
Как описано в мануале написали на С и добавили запись в файл залили в контроллер
код:

#include "shm.hpp"
#include <stdio.h>
#include <time.h>
#include <unistd.h>
#include <signal.h>
#include <rlserial.h>

int main()
{
Shm mymem("./load_files.srv"); //Инициализация переменных разделяемой памяти
FILE *file;

struct timespec tv;//Структура для задания временных интервалов
tv.tv_sec = 0;
tv.tv_nsec = 1000000000; //(наносекунд) задержка в 1 сек
// хотя лучше сделать столько-же, сколько период обновления на веб-морде (!)

while (1) // Бесконечный цикл
{
if ((file = fopen("result.txt","w")) == NULL)
{
printf("Can't open file\n");
exit(-1);
} else {
fprintf (file, "<?xml version=\"1.0\" encoding=\"cp1251\">");
fprintf (file, "<result>");
fprintf (file, "<bases>");

nanosleep(&tv, NULL); //выполняем задержку для экономии ресурсов

//================================================== ==================//
// mem_tech - температура наружняя //
//================================================== ==================//
if ( mymem.getType("mem_tech") == FLOAT )
{
float mem_tech = mymem.getFloat("mem_tech");
fprintf(file,"<base>mem_tech = %f</base>",mem_tech);
} else {
fprintf(file,"<base>ERROR: mem_tech has type
%d</base>",mymem.getType("mem_tech"));
exit(-1);
}

//================================================== ==================//
// mem_in - температура канала //
//================================================== ==================//
if ( mymem.getType("mem_in") == FLOAT )
{
float mem_in = mymem.getFloat("mem_in");
fprintf(file,"<base>mem_in = %f</base>",mem_in);
} else {
fprintf(file,"<base>ERROR: mem_in has type
%d</base>",mymem.getType("mem_in"));
exit(-1);
}

//================================================== ==================//
// mem_out - температура обр_воды //
//================================================== ==================//
if ( mymem.getType("mem_out") == FLOAT )
{
float mem_out = mymem.getFloat("mem_out");
fprintf(file,"<base>mem_out = %f</base>",mem_out);
} else {
fprintf(file,"<base>ERROR: mem_out has type
%d</base>",mymem.getType("mem_out"));
exit(-1);
}

//================================================== ==================//
// mem_room - температура помещения //
//================================================== ==================//
if ( mymem.getType("mem_room") == FLOAT )
{
float mem_room = mymem.getFloat("mem_room");
fprintf(file,"<base>mem_room = %f</base>",mem_room);
} else {
fprintf(file,"<base>ERROR: mem_room has type
%d</base>",mymem.getType("mem_room"));
exit(-1);
}


fprintf (file, "</bases>");
fprintf (file, "</result>");
fclose(file);
}
}
}

Но почему-то он записывает в файл "-1"

От сюда можно сделать вывод - он не берет значения! Почему?

Подскажите что делать? Как дальше жить?
AlexSE вне форума   Ответить с цитированием