Commit 73a88a747c473a7427ef70f0351ff6f5370c3495
1 parent
902c2873
DRY in modbus_reply by improving response_exception()
Thanks to Rüdiger Ranft for the idea.
Showing
1 changed file
with
78 additions
and
138 deletions
src/modbus.c
| @@ -10,6 +10,7 @@ | @@ -10,6 +10,7 @@ | ||
| 10 | #include <stdio.h> | 10 | #include <stdio.h> |
| 11 | #include <string.h> | 11 | #include <string.h> |
| 12 | #include <stdlib.h> | 12 | #include <stdlib.h> |
| 13 | +#include <stdarg.h> | ||
| 13 | #include <errno.h> | 14 | #include <errno.h> |
| 14 | #include <limits.h> | 15 | #include <limits.h> |
| 15 | #include <time.h> | 16 | #include <time.h> |
| @@ -658,14 +659,30 @@ static int response_io_status(uint8_t *tab_io_status, | @@ -658,14 +659,30 @@ static int response_io_status(uint8_t *tab_io_status, | ||
| 658 | 659 | ||
| 659 | /* Build the exception response */ | 660 | /* Build the exception response */ |
| 660 | static int response_exception(modbus_t *ctx, sft_t *sft, | 661 | static int response_exception(modbus_t *ctx, sft_t *sft, |
| 661 | - int exception_code, uint8_t *rsp) | 662 | + int exception_code, uint8_t *rsp, |
| 663 | + unsigned int to_flush, | ||
| 664 | + const char* template, ...) | ||
| 662 | { | 665 | { |
| 663 | int rsp_length; | 666 | int rsp_length; |
| 664 | 667 | ||
| 668 | + /* Print debug message */ | ||
| 669 | + if (ctx->debug) { | ||
| 670 | + va_list ap; | ||
| 671 | + | ||
| 672 | + va_start(ap, template); | ||
| 673 | + vfprintf(stderr, template, ap); | ||
| 674 | + va_end(ap); | ||
| 675 | + } | ||
| 676 | + | ||
| 677 | + /* Flush if required */ | ||
| 678 | + if (to_flush) { | ||
| 679 | + _sleep_response_timeout(ctx); | ||
| 680 | + modbus_flush(ctx); | ||
| 681 | + } | ||
| 682 | + | ||
| 683 | + /* Build exception response */ | ||
| 665 | sft->function = sft->function + 0x80; | 684 | sft->function = sft->function + 0x80; |
| 666 | rsp_length = ctx->backend->build_response_basis(sft, rsp); | 685 | rsp_length = ctx->backend->build_response_basis(sft, rsp); |
| 667 | - | ||
| 668 | - /* Positive exception code */ | ||
| 669 | rsp[rsp_length++] = exception_code; | 686 | rsp[rsp_length++] = exception_code; |
| 670 | 687 | ||
| 671 | return rsp_length; | 688 | return rsp_length; |
| @@ -711,25 +728,17 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -711,25 +728,17 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 711 | int mapping_address = address - mb_mapping->start_bits; | 728 | int mapping_address = address - mb_mapping->start_bits; |
| 712 | 729 | ||
| 713 | if (nb < 1 || MODBUS_MAX_READ_BITS < nb) { | 730 | if (nb < 1 || MODBUS_MAX_READ_BITS < nb) { |
| 714 | - if (ctx->debug) { | ||
| 715 | - fprintf(stderr, | ||
| 716 | - "Illegal nb of values %d in read_bits (max %d)\n", | ||
| 717 | - nb, MODBUS_MAX_READ_BITS); | ||
| 718 | - } | ||
| 719 | - _sleep_response_timeout(ctx); | ||
| 720 | - modbus_flush(ctx); | ||
| 721 | rsp_length = response_exception( | 731 | rsp_length = response_exception( |
| 722 | - ctx, &sft, | ||
| 723 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 732 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 733 | + "Illegal nb of values %d in read_bits (max %d)\n", | ||
| 734 | + nb, MODBUS_MAX_READ_BITS); | ||
| 724 | } else if (mapping_address < 0 || | 735 | } else if (mapping_address < 0 || |
| 725 | (mapping_address + nb) > mb_mapping->nb_bits) { | 736 | (mapping_address + nb) > mb_mapping->nb_bits) { |
| 726 | - if (ctx->debug) { | ||
| 727 | - fprintf(stderr, "Illegal data address 0x%0X in read_bits\n", | ||
| 728 | - mapping_address < 0 ? address : address + nb); | ||
| 729 | - } | ||
| 730 | rsp_length = response_exception( | 737 | rsp_length = response_exception( |
| 731 | ctx, &sft, | 738 | ctx, &sft, |
| 732 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 739 | + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 740 | + "Illegal data address 0x%0X in read_bits\n", | ||
| 741 | + mapping_address < 0 ? address : address + nb); | ||
| 733 | } else { | 742 | } else { |
| 734 | rsp_length = ctx->backend->build_response_basis(&sft, rsp); | 743 | rsp_length = ctx->backend->build_response_basis(&sft, rsp); |
| 735 | rsp[rsp_length++] = (nb / 8) + ((nb % 8) ? 1 : 0); | 744 | rsp[rsp_length++] = (nb / 8) + ((nb % 8) ? 1 : 0); |
| @@ -746,25 +755,17 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -746,25 +755,17 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 746 | int mapping_address = address - mb_mapping->start_input_bits; | 755 | int mapping_address = address - mb_mapping->start_input_bits; |
| 747 | 756 | ||
| 748 | if (nb < 1 || MODBUS_MAX_READ_BITS < nb) { | 757 | if (nb < 1 || MODBUS_MAX_READ_BITS < nb) { |
| 749 | - if (ctx->debug) { | ||
| 750 | - fprintf(stderr, | ||
| 751 | - "Illegal nb of values %d in read_input_bits (max %d)\n", | ||
| 752 | - nb, MODBUS_MAX_READ_BITS); | ||
| 753 | - } | ||
| 754 | - _sleep_response_timeout(ctx); | ||
| 755 | - modbus_flush(ctx); | ||
| 756 | rsp_length = response_exception( | 758 | rsp_length = response_exception( |
| 757 | - ctx, &sft, | ||
| 758 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 759 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 760 | + "Illegal nb of values %d in read_input_bits (max %d)\n", | ||
| 761 | + nb, MODBUS_MAX_READ_BITS); | ||
| 759 | } else if (mapping_address < 0 || | 762 | } else if (mapping_address < 0 || |
| 760 | (mapping_address + nb) > mb_mapping->nb_input_bits) { | 763 | (mapping_address + nb) > mb_mapping->nb_input_bits) { |
| 761 | - if (ctx->debug) { | ||
| 762 | - fprintf(stderr, "Illegal data address 0x%0X in read_input_bits\n", | ||
| 763 | - mapping_address < 0 ? address : address + nb); | ||
| 764 | - } | ||
| 765 | rsp_length = response_exception( | 764 | rsp_length = response_exception( |
| 766 | ctx, &sft, | 765 | ctx, &sft, |
| 767 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 766 | + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 767 | + "Illegal data address 0x%0X in read_input_bits\n", | ||
| 768 | + mapping_address < 0 ? address : address + nb); | ||
| 768 | } else { | 769 | } else { |
| 769 | rsp_length = ctx->backend->build_response_basis(&sft, rsp); | 770 | rsp_length = ctx->backend->build_response_basis(&sft, rsp); |
| 770 | rsp[rsp_length++] = (nb / 8) + ((nb % 8) ? 1 : 0); | 771 | rsp[rsp_length++] = (nb / 8) + ((nb % 8) ? 1 : 0); |
| @@ -779,25 +780,16 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -779,25 +780,16 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 779 | int mapping_address = address - mb_mapping->start_registers; | 780 | int mapping_address = address - mb_mapping->start_registers; |
| 780 | 781 | ||
| 781 | if (nb < 1 || MODBUS_MAX_READ_REGISTERS < nb) { | 782 | if (nb < 1 || MODBUS_MAX_READ_REGISTERS < nb) { |
| 782 | - if (ctx->debug) { | ||
| 783 | - fprintf(stderr, | ||
| 784 | - "Illegal nb of values %d in read_holding_registers (max %d)\n", | ||
| 785 | - nb, MODBUS_MAX_READ_REGISTERS); | ||
| 786 | - } | ||
| 787 | - _sleep_response_timeout(ctx); | ||
| 788 | - modbus_flush(ctx); | ||
| 789 | rsp_length = response_exception( | 783 | rsp_length = response_exception( |
| 790 | - ctx, &sft, | ||
| 791 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 784 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 785 | + "Illegal nb of values %d in read_holding_registers (max %d)\n", | ||
| 786 | + nb, MODBUS_MAX_READ_REGISTERS); | ||
| 792 | } else if (mapping_address < 0 || | 787 | } else if (mapping_address < 0 || |
| 793 | (mapping_address + nb) > mb_mapping->nb_registers) { | 788 | (mapping_address + nb) > mb_mapping->nb_registers) { |
| 794 | - if (ctx->debug) { | ||
| 795 | - fprintf(stderr, "Illegal data address 0x%0X in read_registers\n", | ||
| 796 | - mapping_address < 0 ? address : address + nb); | ||
| 797 | - } | ||
| 798 | rsp_length = response_exception( | 789 | rsp_length = response_exception( |
| 799 | - ctx, &sft, | ||
| 800 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 790 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 791 | + "Illegal data address 0x%0X in read_registers\n", | ||
| 792 | + mapping_address < 0 ? address : address + nb); | ||
| 801 | } else { | 793 | } else { |
| 802 | int i; | 794 | int i; |
| 803 | 795 | ||
| @@ -817,25 +809,16 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -817,25 +809,16 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 817 | int mapping_address = address - mb_mapping->start_input_registers; | 809 | int mapping_address = address - mb_mapping->start_input_registers; |
| 818 | 810 | ||
| 819 | if (nb < 1 || MODBUS_MAX_READ_REGISTERS < nb) { | 811 | if (nb < 1 || MODBUS_MAX_READ_REGISTERS < nb) { |
| 820 | - if (ctx->debug) { | ||
| 821 | - fprintf(stderr, | ||
| 822 | - "Illegal number of values %d in read_input_registers (max %d)\n", | ||
| 823 | - nb, MODBUS_MAX_READ_REGISTERS); | ||
| 824 | - } | ||
| 825 | - _sleep_response_timeout(ctx); | ||
| 826 | - modbus_flush(ctx); | ||
| 827 | rsp_length = response_exception( | 812 | rsp_length = response_exception( |
| 828 | - ctx, &sft, | ||
| 829 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 813 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 814 | + "Illegal number of values %d in read_input_registers (max %d)\n", | ||
| 815 | + nb, MODBUS_MAX_READ_REGISTERS); | ||
| 830 | } else if (mapping_address < 0 || | 816 | } else if (mapping_address < 0 || |
| 831 | (mapping_address + nb) > mb_mapping->nb_input_registers) { | 817 | (mapping_address + nb) > mb_mapping->nb_input_registers) { |
| 832 | - if (ctx->debug) { | ||
| 833 | - fprintf(stderr, "Illegal data address 0x%0X in read_input_registers\n", | ||
| 834 | - mapping_address < 0 ? address : address + nb); | ||
| 835 | - } | ||
| 836 | rsp_length = response_exception( | 818 | rsp_length = response_exception( |
| 837 | - ctx, &sft, | ||
| 838 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 819 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 820 | + "Illegal data address 0x%0X in read_input_registers\n", | ||
| 821 | + mapping_address < 0 ? address : address + nb); | ||
| 839 | } else { | 822 | } else { |
| 840 | int i; | 823 | int i; |
| 841 | 824 | ||
| @@ -852,14 +835,10 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -852,14 +835,10 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 852 | int mapping_address = address - mb_mapping->start_bits; | 835 | int mapping_address = address - mb_mapping->start_bits; |
| 853 | 836 | ||
| 854 | if (mapping_address < 0 || mapping_address >= mb_mapping->nb_bits) { | 837 | if (mapping_address < 0 || mapping_address >= mb_mapping->nb_bits) { |
| 855 | - if (ctx->debug) { | ||
| 856 | - fprintf(stderr, | ||
| 857 | - "Illegal data address 0x%0X in write_bit\n", | ||
| 858 | - address); | ||
| 859 | - } | ||
| 860 | rsp_length = response_exception( | 838 | rsp_length = response_exception( |
| 861 | - ctx, &sft, | ||
| 862 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 839 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 840 | + "Illegal data address 0x%0X in write_bit\n", | ||
| 841 | + address); | ||
| 863 | } else { | 842 | } else { |
| 864 | int data = (req[offset + 3] << 8) + req[offset + 4]; | 843 | int data = (req[offset + 3] << 8) + req[offset + 4]; |
| 865 | 844 | ||
| @@ -868,14 +847,11 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -868,14 +847,11 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 868 | memcpy(rsp, req, req_length); | 847 | memcpy(rsp, req, req_length); |
| 869 | rsp_length = req_length; | 848 | rsp_length = req_length; |
| 870 | } else { | 849 | } else { |
| 871 | - if (ctx->debug) { | ||
| 872 | - fprintf(stderr, | ||
| 873 | - "Illegal data value 0x%0X in write_bit request at address %0X\n", | ||
| 874 | - data, address); | ||
| 875 | - } | ||
| 876 | rsp_length = response_exception( | 850 | rsp_length = response_exception( |
| 877 | ctx, &sft, | 851 | ctx, &sft, |
| 878 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 852 | + MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, FALSE, |
| 853 | + "Illegal data value 0x%0X in write_bit request at address %0X\n", | ||
| 854 | + data, address); | ||
| 879 | } | 855 | } |
| 880 | } | 856 | } |
| 881 | } | 857 | } |
| @@ -884,13 +860,11 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -884,13 +860,11 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 884 | int mapping_address = address - mb_mapping->start_registers; | 860 | int mapping_address = address - mb_mapping->start_registers; |
| 885 | 861 | ||
| 886 | if (mapping_address < 0 || mapping_address >= mb_mapping->nb_registers) { | 862 | if (mapping_address < 0 || mapping_address >= mb_mapping->nb_registers) { |
| 887 | - if (ctx->debug) { | ||
| 888 | - fprintf(stderr, "Illegal data address 0x%0X in write_register\n", | ||
| 889 | - address); | ||
| 890 | - } | ||
| 891 | rsp_length = response_exception( | 863 | rsp_length = response_exception( |
| 892 | ctx, &sft, | 864 | ctx, &sft, |
| 893 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 865 | + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 866 | + "Illegal data address 0x%0X in write_register\n", | ||
| 867 | + address); | ||
| 894 | } else { | 868 | } else { |
| 895 | int data = (req[offset + 3] << 8) + req[offset + 4]; | 869 | int data = (req[offset + 3] << 8) + req[offset + 4]; |
| 896 | 870 | ||
| @@ -905,28 +879,20 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -905,28 +879,20 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 905 | int mapping_address = address - mb_mapping->start_bits; | 879 | int mapping_address = address - mb_mapping->start_bits; |
| 906 | 880 | ||
| 907 | if (nb < 1 || MODBUS_MAX_WRITE_BITS < nb) { | 881 | if (nb < 1 || MODBUS_MAX_WRITE_BITS < nb) { |
| 908 | - if (ctx->debug) { | ||
| 909 | - fprintf(stderr, | ||
| 910 | - "Illegal number of values %d in write_bits (max %d)\n", | ||
| 911 | - nb, MODBUS_MAX_WRITE_BITS); | ||
| 912 | - } | ||
| 913 | /* May be the indication has been truncated on reading because of | 882 | /* May be the indication has been truncated on reading because of |
| 914 | * invalid address (eg. nb is 0 but the request contains values to | 883 | * invalid address (eg. nb is 0 but the request contains values to |
| 915 | * write) so it's necessary to flush. */ | 884 | * write) so it's necessary to flush. */ |
| 916 | - _sleep_response_timeout(ctx); | ||
| 917 | - modbus_flush(ctx); | ||
| 918 | rsp_length = response_exception( | 885 | rsp_length = response_exception( |
| 919 | - ctx, &sft, | ||
| 920 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 886 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 887 | + "Illegal number of values %d in write_bits (max %d)\n", | ||
| 888 | + nb, MODBUS_MAX_WRITE_BITS); | ||
| 921 | } else if (mapping_address < 0 || | 889 | } else if (mapping_address < 0 || |
| 922 | (mapping_address + nb) > mb_mapping->nb_bits) { | 890 | (mapping_address + nb) > mb_mapping->nb_bits) { |
| 923 | - if (ctx->debug) { | ||
| 924 | - fprintf(stderr, "Illegal data address 0x%0X in write_bits\n", | ||
| 925 | - mapping_address < 0 ? address : address + nb); | ||
| 926 | - } | ||
| 927 | rsp_length = response_exception( | 891 | rsp_length = response_exception( |
| 928 | ctx, &sft, | 892 | ctx, &sft, |
| 929 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 893 | + MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 894 | + "Illegal data address 0x%0X in write_bits\n", | ||
| 895 | + mapping_address < 0 ? address : address + nb); | ||
| 930 | } else { | 896 | } else { |
| 931 | /* 6 = byte count */ | 897 | /* 6 = byte count */ |
| 932 | modbus_set_bits_from_bytes(mb_mapping->tab_bits, mapping_address, nb, | 898 | modbus_set_bits_from_bytes(mb_mapping->tab_bits, mapping_address, nb, |
| @@ -944,28 +910,16 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -944,28 +910,16 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 944 | int mapping_address = address - mb_mapping->start_registers; | 910 | int mapping_address = address - mb_mapping->start_registers; |
| 945 | 911 | ||
| 946 | if (nb < 1 || MODBUS_MAX_WRITE_REGISTERS < nb) { | 912 | if (nb < 1 || MODBUS_MAX_WRITE_REGISTERS < nb) { |
| 947 | - if (ctx->debug) { | ||
| 948 | - fprintf(stderr, | ||
| 949 | - "Illegal number of values %d in write_registers (max %d)\n", | ||
| 950 | - nb, MODBUS_MAX_WRITE_REGISTERS); | ||
| 951 | - } | ||
| 952 | - /* May be the indication has been truncated on reading because of | ||
| 953 | - * invalid address (eg. nb is 0 but the request contains values to | ||
| 954 | - * write) so it's necessary to flush. */ | ||
| 955 | - _sleep_response_timeout(ctx); | ||
| 956 | - modbus_flush(ctx); | ||
| 957 | rsp_length = response_exception( | 913 | rsp_length = response_exception( |
| 958 | - ctx, &sft, | ||
| 959 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 914 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 915 | + "Illegal number of values %d in write_registers (max %d)\n", | ||
| 916 | + nb, MODBUS_MAX_WRITE_REGISTERS); | ||
| 960 | } else if (mapping_address < 0 || | 917 | } else if (mapping_address < 0 || |
| 961 | (mapping_address + nb) > mb_mapping->nb_registers) { | 918 | (mapping_address + nb) > mb_mapping->nb_registers) { |
| 962 | - if (ctx->debug) { | ||
| 963 | - fprintf(stderr, "Illegal data address 0x%0X in write_registers\n", | ||
| 964 | - mapping_address < 0 ? address : address + nb); | ||
| 965 | - } | ||
| 966 | rsp_length = response_exception( | 919 | rsp_length = response_exception( |
| 967 | - ctx, &sft, | ||
| 968 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 920 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 921 | + "Illegal data address 0x%0X in write_registers\n", | ||
| 922 | + mapping_address < 0 ? address : address + nb); | ||
| 969 | } else { | 923 | } else { |
| 970 | int i, j; | 924 | int i, j; |
| 971 | for (i = mapping_address, j = 6; i < mapping_address + nb; i++, j += 2) { | 925 | for (i = mapping_address, j = 6; i < mapping_address + nb; i++, j += 2) { |
| @@ -1009,13 +963,10 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -1009,13 +963,10 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 1009 | int mapping_address = address - mb_mapping->start_registers; | 963 | int mapping_address = address - mb_mapping->start_registers; |
| 1010 | 964 | ||
| 1011 | if (mapping_address < 0 || mapping_address >= mb_mapping->nb_registers) { | 965 | if (mapping_address < 0 || mapping_address >= mb_mapping->nb_registers) { |
| 1012 | - if (ctx->debug) { | ||
| 1013 | - fprintf(stderr, "Illegal data address 0x%0X in write_register\n", | ||
| 1014 | - address); | ||
| 1015 | - } | ||
| 1016 | rsp_length = response_exception( | 966 | rsp_length = response_exception( |
| 1017 | - ctx, &sft, | ||
| 1018 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 967 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, |
| 968 | + "Illegal data address 0x%0X in write_register\n", | ||
| 969 | + address); | ||
| 1019 | } else { | 970 | } else { |
| 1020 | uint16_t data = mb_mapping->tab_registers[mapping_address]; | 971 | uint16_t data = mb_mapping->tab_registers[mapping_address]; |
| 1021 | uint16_t and = (req[offset + 3] << 8) + req[offset + 4]; | 972 | uint16_t and = (req[offset + 3] << 8) + req[offset + 4]; |
| @@ -1039,29 +990,19 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -1039,29 +990,19 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 1039 | if (nb_write < 1 || MODBUS_MAX_WR_WRITE_REGISTERS < nb_write || | 990 | if (nb_write < 1 || MODBUS_MAX_WR_WRITE_REGISTERS < nb_write || |
| 1040 | nb < 1 || MODBUS_MAX_WR_READ_REGISTERS < nb || | 991 | nb < 1 || MODBUS_MAX_WR_READ_REGISTERS < nb || |
| 1041 | nb_write_bytes != nb_write * 2) { | 992 | nb_write_bytes != nb_write * 2) { |
| 1042 | - if (ctx->debug) { | ||
| 1043 | - fprintf(stderr, | ||
| 1044 | - "Illegal nb of values (W%d, R%d) in write_and_read_registers (max W%d, R%d)\n", | ||
| 1045 | - nb_write, nb, | ||
| 1046 | - MODBUS_MAX_WR_WRITE_REGISTERS, MODBUS_MAX_WR_READ_REGISTERS); | ||
| 1047 | - } | ||
| 1048 | - _sleep_response_timeout(ctx); | ||
| 1049 | - modbus_flush(ctx); | ||
| 1050 | rsp_length = response_exception( | 993 | rsp_length = response_exception( |
| 1051 | - ctx, &sft, | ||
| 1052 | - MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp); | 994 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_VALUE, rsp, TRUE, |
| 995 | + "Illegal nb of values (W%d, R%d) in write_and_read_registers (max W%d, R%d)\n", | ||
| 996 | + nb_write, nb, MODBUS_MAX_WR_WRITE_REGISTERS, MODBUS_MAX_WR_READ_REGISTERS); | ||
| 1053 | } else if (mapping_address < 0 || | 997 | } else if (mapping_address < 0 || |
| 1054 | (mapping_address + nb) > mb_mapping->nb_registers || | 998 | (mapping_address + nb) > mb_mapping->nb_registers || |
| 1055 | mapping_address < 0 || | 999 | mapping_address < 0 || |
| 1056 | (mapping_address_write + nb_write) > mb_mapping->nb_registers) { | 1000 | (mapping_address_write + nb_write) > mb_mapping->nb_registers) { |
| 1057 | - if (ctx->debug) { | ||
| 1058 | - fprintf(stderr, | ||
| 1059 | - "Illegal data read address 0x%0X or write address 0x%0X write_and_read_registers\n", | ||
| 1060 | - mapping_address < 0 ? address : address + nb, | ||
| 1061 | - mapping_address_write < 0 ? address_write : address_write + nb_write); | ||
| 1062 | - } | ||
| 1063 | - rsp_length = response_exception(ctx, &sft, | ||
| 1064 | - MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp); | 1001 | + rsp_length = response_exception( |
| 1002 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_DATA_ADDRESS, rsp, FALSE, | ||
| 1003 | + "Illegal data read address 0x%0X or write address 0x%0X write_and_read_registers\n", | ||
| 1004 | + mapping_address < 0 ? address : address + nb, | ||
| 1005 | + mapping_address_write < 0 ? address_write : address_write + nb_write); | ||
| 1065 | } else { | 1006 | } else { |
| 1066 | int i, j; | 1007 | int i, j; |
| 1067 | rsp_length = ctx->backend->build_response_basis(&sft, rsp); | 1008 | rsp_length = ctx->backend->build_response_basis(&sft, rsp); |
| @@ -1085,9 +1026,8 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | @@ -1085,9 +1026,8 @@ int modbus_reply(modbus_t *ctx, const uint8_t *req, | ||
| 1085 | break; | 1026 | break; |
| 1086 | 1027 | ||
| 1087 | default: | 1028 | default: |
| 1088 | - rsp_length = response_exception(ctx, &sft, | ||
| 1089 | - MODBUS_EXCEPTION_ILLEGAL_FUNCTION, | ||
| 1090 | - rsp); | 1029 | + rsp_length = response_exception( |
| 1030 | + ctx, &sft, MODBUS_EXCEPTION_ILLEGAL_FUNCTION, rsp, FALSE, ""); | ||
| 1091 | break; | 1031 | break; |
| 1092 | } | 1032 | } |
| 1093 | 1033 |