RSLogix 5000. Collection of alarm bits to common bit with the ability to reset

Несложная реализация сбора алармовых сигналов в общий бит (CommonAlarmBit) с возможностью сброса (PressButton)


C/C++. The definition of the range for random numbers. Division with remainder and without

В программировании есть такие арифметические операции – деление с остатком a%b, обозначим результат через q  и целочисленное деление без остатка a/b, результат обозначим через r. Тогда в общем виде делимое число можно представить следующим образом, где a – делимое число, b - делитель:

                                                               a=b*r + q

В C++ есть генератор случайных целых чисел – int rand() – диапазон выдаваемых значений ограничен размером внутренней константы RAND_MAX - от 0 до 32767. Но на практике иногда приходится работать с более узкими диапазонами. Как же можно сузить диапазон в данном случае? Для этого прибегают к такому ухищрению:

                                                             rand()%x + y

В этом случае мы будем получать случайные числа из диапазона между y и x, то бишь

                                                        y ≤ rand()%x + y ≤ x

Корректно ли использовать данный подход? Для поиска ответа снова воспользуемся вышеприведенным выражением:

                                                                  a = b*r + q

С точки зрения программирования это выражение можно представить и так:

                                                            a = b*(a/b) + (a%b)

Мы знаем, что в случае, когда a кратно b, то второе слагаемое равно нулю:


То есть в точках 2n и 2n+1 q обращается в ноль. Рассмотрим этот диапазон, для этого предположим, что a/b лежит между 2n и 2n+1, запишем это утверждение следующим образом:

                            (a/b) = 2n + ε, где ε - величина смещения в диапазоне от 2n до 2n+1

Подставим данное уравнение в общее уравнение:

                                                          a = b(2n + ε) + q = 2nb + bε + q,
                                                                      q(ε) = a - 2nb - bε


Так как 0 ≤ ε ≤ 1, то q(1) ≤ q ≤ q(0), здесь стоит оговориться – возможно, что покажется неочевидным второе неравенство, но если посмотреть внимательно на полученное уравнение:

                                                                      q(ε) = a - 2nb - bε,

то можно видеть, что чем больше ε, тем меньше q(ε)   и наоборот, чем меньше ε, тем больше q(ε). Отсюда имеем математическое неравенство q(1) ≤ q ≤ q(0), раскроем его и решим:

                                                                     a - 2nb - b ≤ q ≤ a - 2nb,

                                                                                   -b ≤ q ≤ 0

Перемножим обе части неравенства на -1:

                                                                                    0 ≤ q ≤ b

Перепишем это неравенство с точки зрения программирования:

                                                                                 0 ≤ (a%b) ≤ b

Таким образом, мы доказали (подтвердили) правильность подхода при сужении диапазона выходных случайных чисел для тех или иных практических задач с помощью вот такого выражения:

                                                                                  rand()%x + y  

Всем отличного утра, дня или ночи :)

Jquery. События для динамически добавленных элементов в DOM - структуру

Jquery - одна из тех js - библиотек, которые позволяют увеличить скорость разработки веб-приложений, в частности - на клиентской стороне. Особенно удобно использовать ее вместе с PHP - мне этот коктейль показался мощной штукой.
Думаю, многие при использовании jquery сталкивались с такой проблемкой: предположим, что есть некое событие, например - клик по кнопочке, вызов которого добавляет на страничку некий элемент, например - некую ссылку, и пусть при клике на этой ссылке должен сработать написанный вами обработчик. И если вы попытаетесь кликнуть по этой ссылке, то есть вызвать ваш обработчик, то ничего не произойдет. Например, вот так:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
    <script src="jquery-1.9.1.js"></script>
    <script>
        $(document).ready(function(){
           
            // first handler - click on button
            $("#btn").click(function() {
           
                alert("Pressed button");
               
                // Test empty web link
                var link = "<a href='#'>Test link</a>";
                               
                // Add test link to div
                $('#data').html(link);

            });
           
            // second handler - click on test link
            $("a").click(function(){
           
                var content = $(this).html();
                alert(content);
               
            });
      
        });
    </script>
    </head>
    <body>
        <p>Test page:</p>
        <form>
            <input id="btn" type="button" value="Click me">  
        </form>
        <!-- Add test link here -->
        <div id="data"></div>
    </body>
</html>


Первый обработчик -first handler- добавит линк на страничку, но второй обработчик -second handler- не будет срабатывать. Почему?
В данном случае мы имеем дело с динамически (по событию) добавленным в DOM элементом. Связано это с тем, что изначально идет загрузка всего документа и после полной загрузки DOM-структуры документа, мы можем работать с нашими обработчиками. Получается, что они могут работать только с первоначальной структурой документа. Это демонстрируется на следующем примере:

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
    <script src="jquery-1.9.1.js"></script>
    <script>
        $(document).ready(function(){
           
            // Test empty web link
            var link = "<a href='#'>Test link</a>";
                               
            // Add test link to div
            $('#data').html(link);

           
            // second handler - click on test link
            $("a").click(function(){
           
                var content = $(this).html();
                alert(content);
               
            });
      
        });
    </script>
    </head>
    <body>
        <p>Test page:</p>
        <form>
            <input id="btn" type="button" value="Click me">  
        </form>
        <!-- Add test link here -->
        <div id="data"></div>
    </body>
</html>


Если вытащить тело первого обработчика наружу, что приведет к добавлению тестовой ссылки во время загрузки и значит обработчику будет известно о ее существовании (ведь ссылка вошла в первоначальную структуру документа), так и есть, он срабатывает.

Как решить первоначальную проблему?
Для этого в jquery - библиотеке есть специальный метод:

.on( events [, selector ] [, data ], handler(eventObject) )

Он позволяет работать с добавляемыми динамически элементами в DOM-структуру докумена, в нашем случае нужно явно указать селектор тега, куда будет добавлена ссылка и повесить наш обработчик -second handler. Вот как будет выглядеть рабочий вариант:

 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
    <script src="jquery-1.9.1.js"></script>
    <script>
        $(document).ready(function(){
          
          
            // first handler - click on button
            $("#btn").click(function() {
          
                alert("Pressed button");
              
                // Test empty web link
                var link = "<a href='#'>Test link</a>";
                              
                // Add test link to div
                $('#data').html(link);

            });
          
            // second handler - click on test link
            $("#data").on("click", "a", function(){
          
                var content = $(this).html();
                alert(content);
              
            });
     
        });
    </script>
    </head>
    <body>
        <p>Test page:</p>
        <form>
            <input id="btn" type="button" value="Click me"> 
        </form>
        <!-- Add test link here -->
        <div id="data"></div>
    </body>
</html>


Все отрабатывает так, как мы того хотели :)

Ниже приведены еще пара рабочих примеров с аналогичной задачей:

-  добавление ссылок в таблицу

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
    <script src="jquery-1.9.1.js"></script>
    <script>
        $(document).ready(function(){
           
            // second handler - click on test link
            $("#tbl").on("click", "a", function(event){
                var content = $(this).html();
                alert(content);
            });
           
            // first handler - click on button
            $("#btn").click(function() {
           
                alert("Pressed button");
               
                // Create and fill table
                var table_row = "<tr>" +
                                    "<td><a href='#' class='gip'>A11</a></td>" +
                                    "<td><a href='#' class='gip'>A12</a></td>" +
                                    "<td><a href='#' class='gip'>A21</a></td>" +
                                    "<td><a href='#' class='gip'>A22</a></td>" +                   
                                "</tr>";
                               
                // Add content to table
                $('#tbl').html(table_row);

            });
      
        });
    </script>
            <style>
            #table_content
            {
            background-color:#00CCFF;
            color:#000000;
            }
        </style>
    </head>
    <body>
        <p><a href="#">Test page:</a></p>
        <form>
            <input id="btn" type="button" value="Click me to get json-data">  
        </form>
        <!-- In this table will be displayed the data -->
        <table id="tbl" border="1"></table>
    </body>
</html>


- добавление ссылок в строку

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
                    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; Charset=UTF-8">
    <script src="jquery-1.9.1.js"></script>
    <script>
        $(document).ready(function(){
          
            $('#add').click(function(){
                $('body').append('<a class="new_el">new element</a>');
            });
          
            $('body').on('click','.new_el', function(){
                alert('event on  new_wl');
            });
     
        });
    </script>
    </head>
    <body>
        <p>Test page:</p>
        <!-- Add test link here -->
        <a id="add">add element</a>
    </body>
</html>

Математика вокруг нас, нужно только всмотреться

Числа. Что это такое и зачем они нужны?
Есть такая наука - математика, которая занимается изучением чисел и абстракциями над ними. Представим себе, что нам нужно сосчитать, например, количество камней, которые некто положим перед нами на стол? Сложна ли эта задача? Ну, для нас с вами это элементарно, ведь мы наделены знаниями и понятиями о числах еще со школьной скамьи. Один камень, два, три, итак, мы имеем три камня. Но какова эта задача представала перед древними людьми? Рост сознания древнего человека привело к практической нужде вести учет того, что его окружало. Количество охотников в племени, количество орудия, количество хищников, количество собранных предметов, ягод и другое. Зачем мог потребоваться такой учет? Ответ на этот вопрос кроется в другом вопросе: как можно передать информацию о количестве своим собратьям? Нарисовав двух мамонтов или начертив палочки на песке можно было показать, передать количественную информацию. Вот если бы мы могли обмениваться своими мыслями, образами, тогда может и не понадобился бы такой способ. Так зарождалась математика, наука о числах. Помимо учета среди племени были и такие люди, которые сидя у костра устремляли свои взор на ночное небо в попытке подсчитать количество звезд. Думаю, они задавались вопросом, как же можно было их все охватить? Зачем им это нужно было? Нам свойственна любознательность и это было проявлением пытливости нашего ума. Такие люди были самыми первыми учеными, потому что именно они ставили перед собой такую задачу подсчета количества видимых звезд на небе. Замечали ли вы когда-нибудь за собой такое: едите ли, идете ли или просто сидите, вы сами по себе начинаете считать количество окон в соседнем доме или количество машин, проезжающих мимо вас? Вот вот, значит и в вас живет ученый дух. С развитием человеческой цивилизации развивалась и математика. Вопрос подсчета перебором сменился вопросами арифметического подсчета: сколько было камней в корзине до того, как их стало десять. Своего рода начала алгебры. Использование начертания черточек на скалах или песке было недостаточно, так стали возникать предпосылки возникновения новых понятий и новых символик в математике. Например, число ноль, чем не абстракция? Развитие людей было многосторонним, поэтому со временем появился папирус (первый прототип современной бумаги), что сделало возможным записывать мысли, сохранять, приумножать и передавать их другим людям. И вот после долгих лет развития перед нами предстает современная математика. Она полна абстракций, логики, теорем, доказательств, полна направлениями, разделами, но все это так или иначе крутится вокруг понятия чисел. Рассмотрим такую тригонометрическую функцию как sin(). Мы с вами воспринимаем ее как само собой разумеющееся, но ведь у нее есть своя история, когда-то она просто напросто отсутствовала, ввели ее в арсенал математики, чтобы можно было выражать свои мысли при изучении прямоугольных треугольников, она выражала зависимость сторон этого треугольника от острых углов при гипотенузе. Вот небольшая история этой функции.
Линия синуса у индийских математиков первоначально называлась «арха-джива» («полутетива», то есть половина хорды), затем слово «арха» было отброшено и линию синуса стали называть просто «джива». Арабские переводчики не перевели слово «джива» арабским словом «ватар», обозначающим тетиву и хорду, а транскрибировали арабскими буквами и стали называть линию синуса «джиба». Так как в арабском языке краткие гласные не обозначаются, а долгое «и» в слове «джиба» обозначается так же, как полугласная «й», арабы стали произносить название линии синуса «джайб», что буквально обозначает «впадина», «пазуха». При переводе арабских сочинений на латынь европейские переводчики перевели слово «джайб» латинским словом sinus, имеющим то же значение.
Современные краткие обозначения \sin и \cos введены Уильямом Отредом и закреплены в трудах Эйлера [Wiki].
В дальнейшем оказалось, что она применима и в жизни. Например, мы знаем, что времена года сменяют друг друга строго периодически, то есть повторяются через определенные промежутки времени, периодически. А функция sin() как раз-таки описывает периодические числа. Значит можно попытаться описать смену времен года через эту математическую функцию. Многие явления вокруг нас периодические. С самого начала числа были сопряжены, сопоставимы, отображены на то, что нас окружает.
1 камень + 1 камень = 2 камня
Вообще число, числа могут быть сопоставимы к любому объекту. Это абстракция. Таким образом абстрагируясь можно было с помощью чисел объяснять, описывать, учитывать предметы, происходящие вокруг нас явления. Мы подошли к такой науке как физика. Если математика делает упор на изучение чисел, различных математических абстракций, то в физике числа всегда сопряжены с изучаемым явлением. Меня до глубины души поражает, когда делаются открытия на кончике пера (ручки, мела), это из рода теоретической физики. Поль Адриен Морис Дирак - один из таких открывателей, который смог предсказать удивительные вещи в природе (существование античастиц). Как такое возможно? Из догадки сделать открытие? Во-первых, все зиждется на математическом подходе (1 + 1 всегда = 2, если это не так, то где-то кроется новое открытие :) ); во-вторых, нужно так увидеть, прочувствовать, вжиться и удивиться явлению, даже обыденному, чтобы правильно выразить свои мысли математически, правильно выбрать математический аппарат. Поэтому физик должен не просто знать математику, но и чувствовать ее, видеть ее красоту. Физика - математика, сопряженная с реальностью! Так, высказывая математически физические идеи, приходят к математическим результатам, из которых как итог анализа извлекаются физические гипотезы, которые в дальнейшем должны быть либо подтверждены, либо опровергнуты опытным путем. Но все же математика послужила основным инструментом. Часто на выходе можно получить математический мусор, так называемая "математическая аберрация", которые не имеют физического смысла, но вот среди этого мусора Поль Дирак смог разглядеть столь удивительный и для того, и для нашего времени результат - существование состояний с отрицательной энергией. Так была высказана гипотеза о существовании античастицы электрона - позитрона. Что в дальнейшем подтвердилось на опыте. Удивительно, не так ли?
Числа, они бывают разные, положительные, отрицательные, натуральные, комплексные... Комплексные числа, эти удивительные числа имеют действительную и мнимую части. О, боже, как это? Мы снова имеем дело с дополнением, которое сделало возможным описывать, выражать мысли с помощью математики. И как всегда они нашли практическую пригодность в других направлениях, например, в мире микромира, в мире удивительной квантовой физики. Если вспомнить о нашей функции sin(), то с учетом комплексных чисел ее можно записать так:
\sin x = \operatorname{Im}(e^{i x}). \, 
Экспоненциальная часть - выражение великого математика Эйлера:
 e^{i \vartheta} = \cos\vartheta + i\sin\vartheta \,
 На последок приведу слова Дирака.

Физические законы должны обладать математической красотой

 По-видимому, одним из фундаментальных свойств природы является то, что основные физические законы описываются с помощью математической теории, обладающей настолько большим изяществом и мощью, что требуется чрезвычайно высокий уровень математического мышления, чтобы понять ее. Вы можете спросить: почему природа устроена именно так? На это можно только ответить, что наши современные знания показывают, что природа, по-видимому, устроена именно таким образом. Мы просто должны согласиться с этим. Описывая эту ситуацию, можно сказать, что Бог является математиком весьма высокого класса и в своем построении Вселенной он пользовался весьма сложной математикой.

Трудно не согласиться с этими словами. Действительно, ведь если задуматься, то математика, точнее числа, повсюду, нужно только всмотреться ;)


Вот так от древних людей до современных людей из поколения в поколения множились и передавались знания, что также удивительно! Недаром Исаак Ньютон писал в письме Роберту Гуку "Если я видел дальше других, то потому, что стоял на плечах гигантов". Так что все мы с вами стоим на их плечах! 

PHP. Предотвращение SQL инъекций


Применение mysql_real_escape_string() к каждой переменной, вставляемой в запрос, предотвращает SQL Injection. Нижеследующий код является одним из вариантом составления запросов и не зависит от установки Magic Quotes.


<?php
// Функция экранирования переменных

function
quote_smart($value)
{

    // если magic_quotes_gpc отключена - используем stripslashes
    if (get_magic_quotes_gpc()) {
        $value = stripslashes($value);
    }
    // Если переменная - число, то экранировать её не нужно
    // если нет - то окружем её кавычками, и экранируем
    if (!is_numeric($value)) {
        $value = "'" . mysql_real_escape_string($value) . "'";
    }
    return $value;
}


// Подключаемся

$link
= mysql_connect('mysql_host', 'mysql_user', 'mysql_password')
    OR die(mysql_error());

// Составляем безопасный запрос

$query
= sprintf("SELECT * FROM users WHERE user=%s AND password=%s",
            quote_smart($_POST['username']),
            quote_smart($_POST['password']));

mysql_query
($query);
?>

Запрос, составленный таким образом, будет выполнен без ошибок, и взлом с помощью SQL Injection окажется невозможен.

Со временем в документации вычитал, что данный метод - mysql_real_escape_string - считается устаревшим и взамен предлагается использовать:

- mysqli_real_escape_string()
- PDO::quote()

Пример простой обработки значений, которые пришли от пользователя. Для этого можно использовать функции strip_tags() и substr() для удаления всех тегов HTML и сокращения его размера. Такая обработка никогда не помешает — нельзя целиком доверять тому, что вводит пользователь.
При очистке значения выполним один дополнительный шаг в виде процедуры mysql_escape_string(), которая удалит все прочие глюки (такие как одинарные знаки кавычек), которые могут поставить базу данных в тупик :)

$term = strip_tags( substr( $_POST['search'], 0, 100 ) );
$term = mysql_escape_string( $term );

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

C++. Две формы инициализации переменных

В C++ есть две формы инициализации переменных. Явная и неявная.
При явной форме в инициализации участвует инициализатор '=':

int a = 5, b = 6, c = a*b;
extern int d;
string temp = "temp message";

При неявной форме (задается при декларировании переменной):

int a(5), b(6), c(a*b);
extern int d();
string temp("temp message");

У встроенных типов данных имеется специальный синтаксис для задания нулевого значения:

int ival = int();
double dval = double();

Если объект определен как глобальный, спецификация C++ гарантирует, что он будет инициализирован нулевым значением, если же переменная локальная либо динамически размещаемая (с помощью оператора new), ее начальное значение не определено, то есть она может содержать некоторое случайное значение. Что может приводить к различного уровня ошибкам.

RSLogix 5000. Один внешний сигнал и группа моторов. Конвейерный запуск и обратная связь

Задача. Предположим, что есть группа моторов, которые должны как запускаться так и останавливаться согласованно по одному внешнему сигналу с дальнейшим переходом в обратную связь от этого входного сигнала. Запуск и останов должен быть не разовым, а через небольшие промежутки времени.

Интересная задача, конечно, обычно такого рода задачи относятся к конвейерным группам моторов. Предположим, что у нас есть моторы - M1, M2 и M3. Также есть входной сигнал - Signal. Для согласованности можно сделать так, что сигналом к запуску очередного мотора будет сигнал запуска впереди идущего мотора (с учетом интервала времени), а сигналом останова - сигнал останова следующего мотора, также с учетом интервала. Такого рода каскадная связка представлена на рисунке ниже (t12, t23, t32, t21 - соответствующие временные выдержки).
Так как у нас есть еще входной сигнал - Signal, тогда связка, с учетом обратной связи, приобретет вот такой вид.
  У меня получилось решить эту задачу вот таким образом:


Для более детального знакомства доступен исходник - download.
Сие решение разработано и протестировано в среде RSLogix 5000 v.17